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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计特殊四元组】0 o4 Z7 L( C  U
解题思路$ e8 e" q7 n  V! w
签到题,枚举即可。
( b& w% i0 d( W  E1 T7 t- X. c& k2 F7 b, _
代码展示& Z$ R% L0 n4 k% @$ s

$ e! O  u2 K3 L/ ~, M; mclass Solution {% N" q+ p, ~4 \& b+ j8 {: |
   public int countQuadruplets(int[] nums) {
( q! Y& A, P! k6 C2 B: B       int n = nums.length;1 o# _+ r. n* E3 y" r7 z
       int res = 0;' I3 d  B/ ?* v5 k5 f; [! R
       for (int a = 0; a < n; a++) {
4 N* t+ f8 g* y; _$ p5 U% j           for (int b = a + 1; b < n; b++) {! `7 S/ |4 C. s
               for (int c = b + 1; c < n; c++) {
8 ~5 E, |9 T$ p                   for (int d = c + 1; d < n; d++) {( _. J4 o( l/ z; V& z- o
                       if (nums[a] + nums[b] + nums[c] == nums[d]) {6 {; M! V. @9 o/ k; p, X
                           res++;0 @6 w' I3 }) m. J" Z
                      }% k$ r& F  k& M
                  }8 O/ \9 ?1 w1 }2 g5 U$ ]# q
              }
# c& ^0 Z( ]; a& F, T          }
5 e; T- x& _7 @- d7 Q) K2 b% z      }
$ X" z2 e& u$ D" ]& V/ N2 Q       return res;! I: c' K# W( z0 W
  }
, J4 b9 u6 U8 k9 W6 h}
# e; ]& I; \6 j# K* @4 n
4 k# F3 N" M+ ~  f* U
+ j' I1 i# ~) q% O2 L9 N( B. @& S* v6 P! J9 v$ j9 u

5 }1 Q% R  [- q9 B0 T0 Z1 o8 I【 NO.2 游戏中弱角色的数量】, X) d  g+ `. K: |' ~' P! s. i/ p
解题思路! ~5 M, U2 ?5 B9 U5 R
按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
; v% p. @& l+ f! f8 w9 [. U6 ]: G( ~- a. S% `
代码展示" Q0 [: J$ Y# h; ]% r2 l( F: x

( o: l/ x. ]) S: ^* Vclass Solution {3 R) x1 Y  }+ ]
   public int numberOfWeakCharacters(int[][] properties) {
1 E! ?2 p( @- M3 T- r+ x% O: s       Arrays.sort(properties, (a, b) -> {9 R, J/ M6 z/ M9 G$ X' D
           if (a[0] == b[0]) {+ y. P, U# v1 u! L9 R
               return a[1] - b[1];8 a/ d' l/ f3 x
          }, {! X- k5 Z9 m, J# w; y
           return a[0] - b[0];8 m( A4 n* @1 _  }
      });2 E+ k/ m0 z4 _. Z& k
       int res = 0;/ u0 V% |! z# e0 r- Z
       int lastAttack = properties[properties.length - 1][0];
1 Z8 U6 k, ?  b" U- Y. O       int lastDefense = properties[properties.length - 1][1];' j& f8 X( f3 R
       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力' g" p+ B7 A  r# B- B% D
       for (int i = properties.length - 2; i >= 0; i--) {
' \5 v0 a/ q0 f- H; @           if (properties[i][0] < lastAttack) {: b1 K7 e6 s) ~  B4 ^) X  ~
               maxDefense = Math.max(maxDefense, lastDefense);
1 C$ \  w- s  X% p3 _- X               lastAttack = properties[i][0];
! S8 O9 l: I8 l. x3 a" u0 ?               lastDefense = properties[i][1];0 l  s( v0 W3 w) H6 x  o, F
          }
4 s+ o7 c+ [& `, a           if (properties[i][1] < maxDefense) {2 v' R: l7 r  Y: V! Q4 t
               res++;& x5 @3 Q" x1 C3 ^. H
          }
$ o( h- O* P. S5 }/ Q      }/ k6 e% G; i2 q5 Z& \" Y
       return res;
  ?1 E' L* H/ ^4 [: m0 D' i" h  }9 h3 W! ~7 \6 k" r# }" O; M
}
% k$ d: q$ Y7 E9 K. x: Y
4 r% n  e, o  ]/ y( @% K! ~; t+ }
【 NO.3 访问完所有房间的第一天】
5 e6 r: ~  v0 G% X
  X; k* J/ H" t7 q, Q) ]解题思路
. g! W6 y1 R9 |9 Y动态规划,dp[i] 表示访问完第 i 个房间的最小天数。& O: m. E1 F! c5 s3 }
1 m, @7 ^$ B( R( o
代码展示; U+ B2 R3 i- i  e

% W# O3 ~9 d' vclass Solution {* I  n1 o( w; ^
   public int firstDayBeenInAllRooms(int[] nextVisit) {
' t- P! I7 `0 D       int n = nextVisit.length;
4 G+ E$ {; q8 d0 n5 F9 F/ {       long[] dp = new long[n];4 J5 e0 @/ S/ w3 o  {, d4 p8 u( o$ B
       long P = (long) (1e9 + 7);
( ]' I0 m) B* a/ F8 D' s       for (int i = 1; i < n; ++i) {
4 p2 z, B+ Y! s1 p5 w' a; n           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;
7 _6 v2 ]/ Y! j+ g3 n( p( {4 K. u      }8 V6 D4 r/ T4 _: E
       return (int) dp[n - 1];7 ?1 u9 u# s) I' D5 M
  }
) ~; Y$ c* r7 O' C}
+ w/ ]0 U/ }# E2 T4 `, u
0 o9 W. y7 [9 g+ ]) {- B% y【 NO.4 数组的最大公因数排序】# \1 C* h9 q' w' a, o

+ J, z5 [' }/ S* r( ]4 N解题思路
% o6 X: l$ ~8 F; K3 X只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
' T$ L  Z8 A& B) V" A' q( Z% o, b& S6 w+ B3 T' r; d; D( q
; g3 u$ v# V4 c' R; Y8 w. G+ a
代码展示7 B( H/ V( b3 ?8 h$ i

7 R2 W2 b: {& P% |+ bclass UnionFind {9 g2 R6 I1 V" r7 a
   public UnionFind(int size) {
. ]$ F4 z) Z5 O( X( U+ \       f = new int[size];& ]. Q! j  j1 i2 D/ _$ h+ m; Z: k7 K
       Arrays.fill(f, -1);6 u3 d' V1 T" q. y& r* @
  }
: P3 o5 m$ }3 {' ?- K3 M) Q- g
   public int find(int x) {6 {1 H- B" G+ e  j0 D/ o* j
       if (f[x] < 0)5 x* e8 @: c0 X) ~5 z0 k9 K( h8 A2 l$ P
           return x;
$ b7 C% x! q# v7 r       return f[x] = find(f[x]);" D" ~& n, \. m7 a
  }/ z) @0 X. }3 m$ t& A) v; E7 N3 |; I$ ]

* s( k8 A% m! n! @6 [* n3 F   public boolean merge(int a, int b) {! M; u9 {5 }& M% b7 F7 ~! C" ^
       int fa = find(a);
; F; m) h. R- P" Z' ~       int fb = find(b);
/ Q, Q/ P* [  \  t  C1 d0 V9 ]       if (fa == fb)
( Q. S4 W2 i7 @           return false;! b$ D/ R( b: W8 |  m) }' Y( c, c
       f[fa] = fb;# i4 m. N6 P, [  |+ `  m) |
       return true;
3 n4 i" [+ _/ Q# Q  }
9 @) W: w! ]% {" L4 i% M: w# Z: F' @. y1 H; B) K
   public Map<Integer, List<Integer>> sets() {* t8 r6 y; I$ a& D
       Map<Integer, List<Integer>> res = new HashMap<>();6 }% E  [% Q2 C8 t% O4 |/ x
       for (int i = 0; i < f.length; i++) {
- D& _0 |3 u+ F( v# h           int fi = find(i);
3 A' k, A1 b4 ?. [           if (!res.containsKey(fi)) {
) g1 N2 t! `8 m! [6 e2 d5 S: ~               res.put(fi, new ArrayList<>());
  M" p( ]$ }+ D( P          }- J; f' K4 F! P
           res.get(fi).add(i);
5 o* T7 |( `) ^      }% I  p* }) \* f" \% F
       return res;
% Q9 @  E, o& o2 M4 X7 Z' T0 m  }. l& Z8 L) Q* n4 i( i; \* z; u  T

' r, E' H* f- t$ p. i" W   private int[] f;
' y# D; u3 I- f" x! c+ }0 I}
+ J0 I, v' h  K' s/ C4 E5 M1 b- x( }. x
3 I8 `: J3 ^: S& [
class Solution {
5 e* p+ C8 @4 P% t/ V% C9 V4 Z4 `   public boolean gcdSort(int[] nums) {
" U$ {' b/ g- f% M       Map<Integer, List<Integer>> set = new HashMap<>();9 E* g% m1 z8 w& u
       for (int i = 0; i < nums.length; i++) {6 |7 l/ a/ M# u  i! G# s
           for (int j = 1; j * j <= nums[i]; j++) {$ _8 m1 \9 ]& i( j2 o+ D/ n* x
               if (nums[i] % j == 0) {
8 ?) z+ {* p2 X7 b                   if (!set.containsKey(j)) {
% T' X( E+ ~& n: O/ Q& R                       set.put(j, new ArrayList<>());
( v% J4 k; i" A* B( S                  }6 s( c+ x  s( B) @5 K: j# z
                   set.get(j).add(i);
4 q6 j/ h1 B; H9 Z6 C3 t& s                   if (j * j < nums[i]) {' e, ?/ D& ]9 Z! x  U% g
                       int k = nums[i] / j;
* j5 ~% H' g- m                       if (!set.containsKey(k)) {
, A0 C/ m5 A$ E5 T                           set.put(k, new ArrayList<>());, l- f3 A& b9 ?
                      }
3 x5 \$ E% G( d7 }# i- [                       set.get(k).add(i);( T. ^" ?8 T3 h; \: b
                  }8 X1 Y: t; H: F2 S( f# \
              }$ [" w6 }4 D, F# j
          }
3 V' X) y& A+ G( O: S$ e      }
$ w2 g+ i1 E: E9 K& d* [
9 y/ w, |+ b$ l6 R' P       UnionFind uf = new UnionFind(nums.length);
, L, B: ~* E9 ~+ e- k       for (var e : set.entrySet()) {
4 \' n: F5 f( n. X+ n5 D: s           if (e.getKey() < 2) {% H8 n, K% G# m2 s. g
               continue;* {1 y1 {" Q- u9 _/ k2 g5 A
          }+ U5 f! ~: J; z, v( y% i& r/ N9 w
           var list = e.getValue();
  k2 o9 m) E! ^           for (int i = 1; i < list.size(); i++) {0 |  q+ @) m$ K# \2 y/ d/ t
               uf.merge(list.get(i - 1), list.get(i));1 U9 N+ c1 s& K3 q) }$ q
          }! R& ]# M# [7 S4 a7 O
      }& T" d1 j' w) ~! ~' G9 t2 J
       var sets = uf.sets();
1 S4 s+ n& e8 W0 @4 q6 M. J5 g       int[] res = new int[nums.length];
# @3 O9 F% [- u; o, G. `       for (var e : sets.entrySet()) {
6 R/ O0 }1 ^1 i+ L3 q) K% |) l           var list = e.getValue();
5 `" k/ E% F# A8 O' U) k           var sortedList = new ArrayList<>(list);
# i  d' p: k8 V" \  r, p" }: h& U           sortedList.sort(Comparator.comparingInt(a -> nums[a]));/ U8 t# h( [1 t2 h% L
           for (int i = 0; i < list.size(); i++) {
+ W6 `9 v6 f/ U5 e# d  x: Q0 ?+ @               res[list.get(i)] = nums[sortedList.get(i)];6 U* p; D( [4 I; N  R1 p( u1 k# t
          }. ]) g1 A$ @0 `
      }1 o% i) }3 l# n
       for (int i = 1; i < res.length; i++) {
! T7 u6 b7 g2 c$ D4 E           if (res[i] < res[i - 1]) {
* d! g6 d2 y- x& t% E& o* m6 \1 R               return false;7 D2 J' l. r2 v; `1 n; U
          }" m, w6 V6 q& A5 d$ E- W
      }! x6 d  d2 {7 g1 @7 z( Q
       return true;
* _0 k* z( I5 F* L/ j& }  }
. p3 `5 C% x' L, L}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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