找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] LeetCode Weekly Contest 257解题报告

上岸算法 回复:0 | 查看:3573 | 发表于 2021-9-5 18:43:23 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
【 NO.1 统计特殊四元组】
) {+ N+ u1 ~* W解题思路$ [- O  c8 J& Y$ Z0 z
签到题,枚举即可。
4 U9 m  f% n- W& u1 q3 T! B" ]; r+ e
代码展示
( u  }0 Z- ~  V5 d* ?8 `6 N1 t2 J$ F; }- n
class Solution {
$ K% \- v5 M: U& U' }   public int countQuadruplets(int[] nums) {/ M" w- ~" r3 ~. N
       int n = nums.length;
9 L. F1 o' p6 j       int res = 0;* {# m  F/ H$ ?
       for (int a = 0; a < n; a++) {
0 m3 o" E% r/ A5 o+ ~           for (int b = a + 1; b < n; b++) {
% T* @1 O+ J$ W3 n               for (int c = b + 1; c < n; c++) {
1 Q( B1 i3 v. I) Q! p                   for (int d = c + 1; d < n; d++) {7 J/ L1 [  B" I! J. o
                       if (nums[a] + nums[b] + nums[c] == nums[d]) {
! l  n7 p5 F% v5 d                           res++;
$ }6 Y$ g! ]9 s8 E- a) F5 k" Z) L) U                      }
& n- P6 y; B1 e0 W) d/ m                  }
* x# N2 q% x. m! B; d              }8 U% G1 q3 ^, f& j- `. q" f
          }
( {3 E0 o% O- n3 o/ C      }" n$ ^, K9 v5 _- l5 z4 {
       return res;
7 f1 w. y0 V2 A' G5 Q( D1 z3 B  }
0 f1 t5 p% t4 c) w: o; l- W}
. @6 o- T; h7 Y& P  U# Z# p9 J
9 l3 @5 d1 ]& k3 T5 o# @4 a
5 N! A' A: M( B0 S$ n1 `. r& T+ @# P( W2 {0 |

6 D1 Y6 @( ~. Z5 v【 NO.2 游戏中弱角色的数量】
% K- v. q5 f% l解题思路
: s, s& h7 h, W+ R8 u( m3 a/ G5 L按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。* y4 e/ x9 K- B; D. @2 l

9 @9 X" X& c/ n$ q) O代码展示
; o* A# D* _8 K' y9 ~4 V; O9 M. f( e' F* o- h9 Q7 c( f
class Solution {3 \3 a$ q& S. M7 W/ ]
   public int numberOfWeakCharacters(int[][] properties) {
5 T5 s* A- ^4 N& d, M* b       Arrays.sort(properties, (a, b) -> {7 M* U. v5 s% Q% d- y3 f: b
           if (a[0] == b[0]) {
# g4 N3 r* ~, `  ?* D: t  g9 O/ T               return a[1] - b[1];8 ^8 g  ~  P' g: ]* @
          }
; S1 A( M# R9 `  Y4 l, n( M           return a[0] - b[0];& c( ?9 D4 l9 y+ Q) `6 D8 j$ \( J
      });- H6 G) V; A. r6 M4 K
       int res = 0;; U3 |; C; y; K2 b3 z
       int lastAttack = properties[properties.length - 1][0];
1 n- @$ F5 f; N/ _% [) t       int lastDefense = properties[properties.length - 1][1];
. R+ Y) L; X) l       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力- d4 W% k* J' y' b% q9 _" A
       for (int i = properties.length - 2; i >= 0; i--) {
% ]8 w8 o3 x1 w/ U) F3 L: Y6 ?           if (properties[i][0] < lastAttack) {" ]' g, M# v: f) k3 U
               maxDefense = Math.max(maxDefense, lastDefense);! O  g) D, G" \- e# ^- C6 I
               lastAttack = properties[i][0];' w$ ^/ m1 M/ @) ~* J# N3 w" N
               lastDefense = properties[i][1];
: E5 L8 B( v% s$ U. e9 @- T5 j          }
% F: j) R8 C" z! o: O           if (properties[i][1] < maxDefense) {  m' ]1 W+ w4 y: n+ k+ a
               res++;: C7 o, g; ^; y7 J
          }
, a# e( G1 h2 b9 D1 b9 e, u      }
  Q+ N  u1 W$ |7 P( D3 _       return res;
' G+ `. B+ d6 b+ [$ t, r  }
- j0 K. h; J$ P# q/ b}
+ Y7 U( g5 G8 M  `3 E! F4 Z
- x. K7 _0 z8 j  z
/ n) Y2 e' {. B! t【 NO.3 访问完所有房间的第一天】4 {/ ^1 x+ m4 U1 d2 ~/ T* n

4 Y1 _6 r; j! S解题思路
" u; H. e2 R0 H" H9 I" c动态规划,dp[i] 表示访问完第 i 个房间的最小天数。- }8 B( p2 e4 @

' _' b+ ~: L) H代码展示
3 P# }# e! C3 c& v% z" u( g5 Y( V0 Z6 P9 I6 F
class Solution {+ \7 }( N) H! o. ~  r; Y
   public int firstDayBeenInAllRooms(int[] nextVisit) {
/ B0 f0 A- u! x3 C* `8 B       int n = nextVisit.length;$ v8 C' u( _: e
       long[] dp = new long[n];$ N. b. O7 x* J/ T$ f
       long P = (long) (1e9 + 7);, Q/ p0 |5 b6 u( t% q& ]9 ^2 c( n
       for (int i = 1; i < n; ++i) {
( E' r/ M) [: E$ s1 ^: u* [$ W           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;! f5 y8 \4 V0 @6 m8 S/ r3 o: p! V" }
      }
. ?$ z* U- J- g       return (int) dp[n - 1];$ l( r. p. V( V
  }$ y; Q2 L& @& [0 h/ X0 V8 q. b+ }
}% p! i1 M2 s7 P. ?+ \
# r, c0 @: o( w9 t( Q% W4 |
【 NO.4 数组的最大公因数排序】4 v; h% P8 m5 C( F" X% O; B
; K" F" v* l5 B% s; J
解题思路# O% }7 ~) _$ [2 |8 U8 B9 t2 ?
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
( k/ t& r5 n: L! C: H
4 X5 Q. W1 B  N/ ^* N0 I
: A4 u+ m7 t. t* l; C! {4 O" x代码展示. D( h5 {/ l2 `
! a, U. S% a8 S9 G" e
class UnionFind {! S& p& }( P4 [! A$ Z$ l& I
   public UnionFind(int size) {: W4 j4 n" f: P: }
       f = new int[size];% }0 I& f& q* F: i) T
       Arrays.fill(f, -1);
2 v2 w8 {0 h* J! Y2 V+ S5 d  }% X- [# k* b& |5 |2 i: `$ t

. ]5 W/ I. |5 s  J( t' g3 |   public int find(int x) {
+ y2 Z' S' n2 `* g( Z: ?       if (f[x] < 0)
2 |! o: I; O5 K6 a3 w' T           return x;
2 _* P7 L/ U1 ~6 F# c- @' y       return f[x] = find(f[x]);
3 }5 u8 P. R  T$ i3 @- `  }
- z/ U( C% E9 b* ^6 ?; n
4 {! B  a8 T- h; L4 C. q9 B   public boolean merge(int a, int b) {
: w+ E7 A2 F# j  B+ [; _- T; M3 S+ o# y       int fa = find(a);
. e2 `6 I. x' X! ^( A5 U       int fb = find(b);3 e1 G6 |0 i5 ~1 {. n- ]
       if (fa == fb)
; K- ]& \$ ^6 x+ N: ~  r+ {           return false;/ d* g1 r. }7 o! q8 e4 A
       f[fa] = fb;+ j7 u) b& m5 Q0 c$ w# u; |
       return true;& A/ t4 @/ B" |, L$ p! V2 G, [
  }% o) T$ B+ o- N0 h, @- w& P

! I- V! [; m1 A   public Map<Integer, List<Integer>> sets() {
/ `/ w5 V" L9 L7 T       Map<Integer, List<Integer>> res = new HashMap<>();
# H5 f, P; F, u/ [' k2 x$ O# V* Y       for (int i = 0; i < f.length; i++) {4 `, J4 X  h: f& [5 n; L
           int fi = find(i);
) ]# }. k5 v7 T$ Q# y$ x2 o           if (!res.containsKey(fi)) {
; f! Y5 @& q  v" a               res.put(fi, new ArrayList<>());
0 g1 ^! _9 G/ r3 p/ s          }9 A- p' h" F* A
           res.get(fi).add(i);
4 Q6 K3 E! s( t2 s      }
$ p3 N1 W* i  f0 p1 w3 c4 p       return res;
$ X( \7 E1 d1 u, R1 I  }  w0 O* Q0 }, ?2 N$ b; f
. z# X' |' _1 @
   private int[] f;
: v" P& w: y- U, }  Z8 o}
2 _! T0 @* B3 }% y: c6 P  `: h/ t/ X

/ t4 N! q% p4 M5 E" b2 \2 }class Solution {5 k! m+ }; a5 u
   public boolean gcdSort(int[] nums) {( @* a. n8 p1 g$ C& v3 u
       Map<Integer, List<Integer>> set = new HashMap<>();
  ], J/ a$ I' |# p5 ^7 e$ W       for (int i = 0; i < nums.length; i++) {
2 N% _& l4 G/ b6 j* g           for (int j = 1; j * j <= nums[i]; j++) {" m. x/ l6 T9 ^' @; D9 K0 o: X
               if (nums[i] % j == 0) {+ d( N/ o$ ?: L' F  O, ~& F$ [) [
                   if (!set.containsKey(j)) {8 Q% @' J: F* W$ f
                       set.put(j, new ArrayList<>());3 x: \. }( n% r/ W2 \3 r7 _0 K: f: a
                  }$ b6 d. _8 i3 P' B1 t1 J+ U- z* M
                   set.get(j).add(i);
0 S& k3 T) t5 k3 `$ `                   if (j * j < nums[i]) {/ j; E3 j- m5 E" K
                       int k = nums[i] / j;8 ~6 Y5 Z6 j  A6 _
                       if (!set.containsKey(k)) {  L6 S, E7 z1 D/ y9 I5 L
                           set.put(k, new ArrayList<>());: _- g3 N( _: s: r. U% O
                      }
8 S- N( H5 E) P7 B6 g                       set.get(k).add(i);( W# ^3 t5 I3 {/ H: X3 L0 c! H( Y% R
                  }0 P6 d) ~2 n' R: Y" [
              }0 X* F: x. n6 X1 U- |# k7 h
          }6 z  h! q! C/ f! \
      }
1 H; |% ^9 `1 x# l
. R. i8 g& M( u       UnionFind uf = new UnionFind(nums.length);
7 v5 N4 G- t  N: R* Z7 ^' V- F$ e       for (var e : set.entrySet()) {- \" p7 E  I) Z. L
           if (e.getKey() < 2) {4 O* H- i2 b$ h% r" W/ i
               continue;6 Y/ W8 o. v3 ?7 v
          }+ P2 D& T9 `7 [& d
           var list = e.getValue();
* \* [7 ~1 b0 v4 k+ `9 n* Y           for (int i = 1; i < list.size(); i++) {' ]$ O+ [  _  b+ P3 G
               uf.merge(list.get(i - 1), list.get(i));( U0 t9 C' w  H3 t6 Q
          }
3 z, E% N% n) z2 i0 q) ~  P& ~      }4 v7 d3 Z; f! [7 }
       var sets = uf.sets();
. T1 x% g9 `4 C       int[] res = new int[nums.length];7 O$ |6 T! V2 s+ l; X
       for (var e : sets.entrySet()) {' c4 h1 e* B% f/ O1 H4 N9 O
           var list = e.getValue();0 \! Q  ?: N5 h1 y/ g6 G
           var sortedList = new ArrayList<>(list);7 x. `) y; \9 Z+ z3 F% ?0 s
           sortedList.sort(Comparator.comparingInt(a -> nums[a]));
; u, c! D/ P4 l7 E           for (int i = 0; i < list.size(); i++) {
: a, R+ h( O# t1 T5 c1 L  y               res[list.get(i)] = nums[sortedList.get(i)];+ a/ ~9 Z$ a4 \6 Y
          }- O& t9 D8 h" L3 _% l
      }
5 ~) D- [( z: E- R       for (int i = 1; i < res.length; i++) {: H4 ]' O' ]% L1 R$ F- C
           if (res[i] < res[i - 1]) {% y6 [! l+ M# ^" N' f; R2 h6 T" \
               return false;& C. s6 V# v/ S& i/ w
          }) f% Y- O) V  |( G4 E7 K  z5 j
      }
& E3 _+ S. J. O$ Z4 a* }- e6 B       return true;
6 A+ r* e) E+ \  }
. D. P6 c0 B" W$ Z3 q: }; E; ]- N, D}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表