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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计特殊四元组】6 S) D2 y  ^$ f/ J
解题思路% H( @% b; x9 ?+ A% I1 K! F
签到题,枚举即可。
" V1 v2 D+ [* k. D) b' G/ J
/ ^3 N. C7 ^2 F- s" s9 H7 T- P% q# ~代码展示+ D. C/ \2 v$ s2 s" @9 b3 T% G

- r# e: q# l# Y  b5 t9 L3 lclass Solution {
$ P" X8 o7 [! W. O   public int countQuadruplets(int[] nums) {$ N; E) ~  L* R. T- z
       int n = nums.length;: i0 O# d& x2 U0 e7 p5 Z
       int res = 0;8 b4 Z: c( E- J% H: j* U, C
       for (int a = 0; a < n; a++) {- Y  N/ A% y* T3 ]- M6 R' @
           for (int b = a + 1; b < n; b++) {
- W5 _" R- m$ g9 ?1 L; w5 `, `               for (int c = b + 1; c < n; c++) {: ^$ `7 k* i' \4 [
                   for (int d = c + 1; d < n; d++) {
& C% ?) g& n+ z& b! y' i                       if (nums[a] + nums[b] + nums[c] == nums[d]) {' W5 I& R- |' F; s- b0 l
                           res++;
  U1 b' J' ?+ m# v2 C6 N! e& c                      }
! _% o3 n& o* Y% w, k                  }0 B9 |1 F. _: z
              }
6 E( p' v( S' w1 V4 ?2 M          }& n, Z; Q& S/ Y! p% n. F
      }- \3 }5 f4 [* S3 G
       return res;
7 k( `3 l% A3 i; Q+ }$ m0 N  }
$ D# k4 e8 Z1 y& N9 O* l8 y5 ~}
8 M$ p8 o- o: o3 y% p4 R% q# K9 C; K+ b7 o
8 N0 S' ?1 G2 W& J' R+ Y
/ u( V6 F' k9 c% h
8 n7 f1 e# r" X9 f; M7 B
【 NO.2 游戏中弱角色的数量】
9 V4 s3 ^8 h' Z1 ~" z解题思路6 E5 K5 B& M4 T. u
按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。" W& H, d& C# m" o  Q4 h4 N
. _' w# ?4 r2 A, E# J& u' ~
代码展示
7 s3 B- E9 F, c6 [: N
* U1 z  j" v( i6 P4 S& |1 q! q0 oclass Solution {
4 w* e+ B# t8 C0 k+ j4 c4 p5 m   public int numberOfWeakCharacters(int[][] properties) {
! p8 Q" G0 J! Y) y- q. X       Arrays.sort(properties, (a, b) -> {, l5 ^8 Y: X! |4 C9 U+ s
           if (a[0] == b[0]) {% c6 g3 }- g- A- {, \
               return a[1] - b[1];
4 [& T4 k; Q% _  L; }1 F, ~          }
' W: \  ]+ g/ [1 x8 N* R           return a[0] - b[0];
3 {1 A6 Y" `* C5 \  S+ `      });
8 w" E+ T( L0 j" M- |       int res = 0;
2 z0 B. K* P7 ~0 a4 l8 i# h+ u1 _3 x4 ^       int lastAttack = properties[properties.length - 1][0];% p5 q. c* W+ `) P
       int lastDefense = properties[properties.length - 1][1];5 v3 j; r3 D9 ^& m
       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力; a4 t& M* T# N8 B+ K
       for (int i = properties.length - 2; i >= 0; i--) {
1 i5 d! k2 _  n/ Y$ D+ Y           if (properties[i][0] < lastAttack) {% r( J  ?$ ]5 o; [8 p' F) L
               maxDefense = Math.max(maxDefense, lastDefense);7 m: e* h9 E! ^) [9 I8 y
               lastAttack = properties[i][0];
" z  t2 K/ _' _' `0 ~4 i               lastDefense = properties[i][1];; L0 n0 p6 M8 Y9 X0 Z. d4 D. Q
          }
" q- r/ u; [, M  K           if (properties[i][1] < maxDefense) {
1 C. p3 G% ~  e9 G: ~# C6 i# G1 }               res++;( M8 \( q' g; W: z" I0 ]  D  M
          }, ]5 `9 ^& S2 [6 Q3 B
      }
4 N# U# k# F- k/ w: N0 f       return res;
7 L+ \& G# R# [# B& {  }
8 A9 _/ Z+ L0 }: b6 h; p2 B, Q}
0 ^6 ~9 a- g, a, {; s
7 N" F" E; O6 u2 k7 S) K
! R) V# b, I3 E( }( B! ~2 e【 NO.3 访问完所有房间的第一天】
( G8 _, f3 z/ ~* h6 x* w3 o7 ?* A( `2 V) Z8 c
解题思路
5 {7 E: l  O3 }3 Q7 N" ?动态规划,dp[i] 表示访问完第 i 个房间的最小天数。
9 X6 S1 ]. }* s) F7 H
4 I9 F: L; _1 P$ G* H代码展示
3 V5 b2 \  X9 x# f: P1 o1 T1 U1 j, n) L; N% _7 M! _
class Solution {
+ }/ a9 j# p% l; a3 k   public int firstDayBeenInAllRooms(int[] nextVisit) {
+ T  q) D8 Q4 x8 a4 I       int n = nextVisit.length;7 p) @2 @; J# K1 Z! [2 \4 t% S
       long[] dp = new long[n];1 O- e. [0 ~2 N9 w: S& C
       long P = (long) (1e9 + 7);. ]( S8 E. E- ?6 x# e! l
       for (int i = 1; i < n; ++i) {
. C9 g6 m6 j" K6 B" S           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;
+ {. A& q. a4 r5 c2 o+ `0 A      }
6 A7 g6 j9 y+ I6 l% h. I5 r       return (int) dp[n - 1];
- h! c; s3 H& T$ J: _  }4 u9 Y/ n4 @2 I$ o- M9 @
}
4 a0 q$ ^4 J$ Z7 `- y8 ?8 f7 l$ l/ r5 \# V+ n
【 NO.4 数组的最大公因数排序】
" Q1 U5 H6 G0 j0 `# ~& A! V
8 Z6 z5 z0 ?+ R4 N) }0 ~7 W/ d% w解题思路( f3 f! _8 ?9 A% k$ Y* X, v
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。5 T7 U1 @6 q, I9 s3 ]

5 _9 z% T# z1 F' C3 ?$ B$ H# O  T! V9 b
代码展示: I! l3 R' g* _1 a

+ [2 I7 X5 \1 s& C! qclass UnionFind {: n& D/ V% K) g1 o8 O; b0 L, M
   public UnionFind(int size) {
1 W, p; ?" ?$ z0 ?7 ^% [       f = new int[size];
% ]' F2 Y( j9 x7 j: O       Arrays.fill(f, -1);( j, _) N0 H" f
  }9 c( _! u: j6 U

% [5 V$ L" P7 g) \9 e7 T   public int find(int x) {
5 Z! g  V3 G/ ^% t! v9 ^7 _       if (f[x] < 0)+ N' w1 a0 D- C$ T
           return x;6 v% E2 S4 z5 M
       return f[x] = find(f[x]);
. W7 K8 g# t5 v. L# }! h  }
1 ]- y: l: c+ d0 \- H! f; ^. a) J$ G+ o% v# w: J( Q: i1 ~  L
   public boolean merge(int a, int b) {
6 y1 t( k5 w( f) X! z  y3 W       int fa = find(a);
" o- O; o1 k2 k4 }+ ?& Z4 _# y! F       int fb = find(b);
) n) h  v: W4 j5 n' t" v       if (fa == fb)
' y, N. ~( e5 L' T1 U7 {           return false;
. ^" N; C* L" U; A       f[fa] = fb;- D2 K) T1 y8 ^
       return true;
/ C7 y4 X0 [6 k: t7 R4 ^! I  }" @$ Q" q9 B0 e0 Z9 L7 H  d

" R! j4 n, w! p% a# h   public Map<Integer, List<Integer>> sets() {
6 M% n- j  U8 D2 \, K% |" ^       Map<Integer, List<Integer>> res = new HashMap<>();" Y4 v& ]( d! N  ]
       for (int i = 0; i < f.length; i++) {
. a. W/ A4 L' t' s# A           int fi = find(i);
6 ?* n8 h- c0 T6 H7 L* x, }           if (!res.containsKey(fi)) {& I0 t' R) c, F6 S% W. i  l! v
               res.put(fi, new ArrayList<>());  w: j7 b  Y  _. X
          }
) E: C2 [3 x3 P' P) Q6 @           res.get(fi).add(i);8 Q- W/ N4 ]; |4 g+ \
      }
# L6 p5 P7 G9 i' M( s  M( @! ?1 ~5 k3 q       return res;- w4 p+ `+ o; f
  }
% K4 N( `; P. ]6 C7 h6 q: A1 a7 o/ E! n0 k% u4 U- k( {
   private int[] f;. [0 g( X7 a0 s1 ]" M6 l) a& Q
}
! f* L! g$ s9 J3 t3 F9 H6 W. P! T' h5 w
7 ~2 V" I4 _& V
class Solution {
! y6 X% S+ d; x  [7 x   public boolean gcdSort(int[] nums) {
8 ]0 d4 a5 I. [       Map<Integer, List<Integer>> set = new HashMap<>();
$ T1 g( X$ o, Q+ E( G       for (int i = 0; i < nums.length; i++) {" I8 W. ?$ R6 c" k( U
           for (int j = 1; j * j <= nums[i]; j++) {9 T, F, Y$ ~! W3 I
               if (nums[i] % j == 0) {' ~: B  y# R2 g/ _
                   if (!set.containsKey(j)) {
6 P2 _5 `- f9 p& Y                       set.put(j, new ArrayList<>());
7 _3 B& B# s# I# D( V                  }
8 c, s1 k9 H4 F, v. r* D                   set.get(j).add(i);
' _: Y3 q( |# H# l                   if (j * j < nums[i]) {/ |$ @& v1 ^6 y" g. g& Y
                       int k = nums[i] / j;
6 U9 h% N% B) O$ f! E! J: [                       if (!set.containsKey(k)) {
; D6 r5 i- v/ C4 H1 J( X) Y                           set.put(k, new ArrayList<>());$ q% P; c9 K+ E; r  _6 u
                      }- Z& |3 ~! M/ W1 ^
                       set.get(k).add(i);
2 B8 o8 B3 |: ?6 a' A) \                  }; H  [$ T! P, {" M! e2 k4 i
              }
' x! v/ A" w3 J* n& G          }, x" i* V5 _7 g# z1 m  [
      }6 O, ?& y/ \( n1 c- K
, Y5 q& d5 ~& Z7 q* u1 I4 v& e
       UnionFind uf = new UnionFind(nums.length);
& a2 Y6 O( S: `  g: X$ T3 W; `       for (var e : set.entrySet()) {3 W. \! ]! B9 W3 y4 v
           if (e.getKey() < 2) {
4 [4 ^/ T2 ~+ v7 F4 b               continue;
4 c9 r  O2 I& w2 t  u          }9 k4 O4 R: {4 h8 t% Y! |
           var list = e.getValue();
% U5 T! L8 n9 t( p8 q' c% u           for (int i = 1; i < list.size(); i++) {! p4 e1 X1 I4 }- Z
               uf.merge(list.get(i - 1), list.get(i));* R: T: ~& R7 n( e7 {6 N; r
          }; H8 k8 X9 m4 q8 ~9 C7 G1 s) ]
      }
* V0 `$ K! V$ h: T       var sets = uf.sets();4 p" J& i" J* N8 Q$ M
       int[] res = new int[nums.length];
# y3 @: m3 P$ L0 y       for (var e : sets.entrySet()) {9 @. ^! \) K) N% D* `2 W- z
           var list = e.getValue();. z! Z" V3 d* |9 o) Y. }
           var sortedList = new ArrayList<>(list);$ l5 f& e4 M2 X
           sortedList.sort(Comparator.comparingInt(a -> nums[a]));( {3 S4 I$ r  a" ^- x: ]
           for (int i = 0; i < list.size(); i++) {
) j5 j% A8 h5 g6 S0 z- T0 g* ~6 p               res[list.get(i)] = nums[sortedList.get(i)];6 g) C: S% L4 f' w) G/ {" X# B
          }
+ I, L: k7 b  a5 V$ J  |+ ~      }
* n* z& P: Y) @       for (int i = 1; i < res.length; i++) {
8 S7 M' D9 u: F: J" u* P. X           if (res[i] < res[i - 1]) {2 v) \. d, p. B6 x3 E
               return false;
# D# b' b9 _. ?          }
/ H' v8 l6 a" Q! c" U$ M% T      }, M2 L0 {  j# C' ?9 l7 U2 e
       return true;/ x& C/ f7 v: N; V$ p) Y, v) I
  }
# z5 J, `1 E$ e1 g) O' ?4 z. r}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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