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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计特殊四元组】
6 }3 p# m/ _# y解题思路6 L9 `+ @, \7 ?0 e# R
签到题,枚举即可。
3 {6 @1 J, G7 h3 W0 H
6 V, E/ E$ v) m0 ]) r1 J4 m代码展示( S: ^% A& v8 U# A% b& w
$ ^2 _# ]& v8 ^% t& |) N
class Solution {
* r, D! O" t0 g   public int countQuadruplets(int[] nums) {3 K+ Y, G0 U. E: X8 Y) |4 m7 c
       int n = nums.length;" g* c, d* y8 i  h
       int res = 0;) j* Y& U* Y$ T7 m/ S
       for (int a = 0; a < n; a++) {' s/ G- N$ R/ L3 U) g
           for (int b = a + 1; b < n; b++) {4 I7 Y0 j" h1 u$ T
               for (int c = b + 1; c < n; c++) {
, Q: q+ k8 T$ x3 F* K                   for (int d = c + 1; d < n; d++) {
6 L* p) p: r3 Q0 H  G                       if (nums[a] + nums[b] + nums[c] == nums[d]) {
4 k" @# J: C9 M                           res++;0 T: h+ F4 e: m& K) ~3 `
                      }% `/ V& ~" A( l& D
                  }, e* Y/ ~+ W: r, _, D
              }
% P# n- U7 h) |          }
  j6 G1 w7 k, P  p      }; Y0 C* O9 H  r- z0 f
       return res;
: s+ L6 _& e8 L5 V  e! L  }$ b* v5 B, j/ d6 r2 ]$ c1 V  v
}/ {/ x7 |7 K1 V8 R- f. Y  p) Y4 _
7 M, S7 ~! O- l% N) L
$ C& n* I( H, Z/ K6 L

7 r" f8 U3 v0 f( B: [- }! c8 R- V6 D% k: A4 q7 f4 \
【 NO.2 游戏中弱角色的数量】/ A3 n2 q9 Q  t. k
解题思路
! t, K2 ^& B! u8 o, s: l按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
- D* ~6 \: P3 R3 `/ U3 d
4 |' z8 U, P: q, W) i代码展示
8 F. G0 ^" J% A& V- ~/ S- }+ a! E! \% X! Q2 I5 s. u1 x- P
class Solution {# W2 p7 h4 L0 k  `; L/ e2 c9 `& k
   public int numberOfWeakCharacters(int[][] properties) {! h4 ?1 @! `' r5 |6 C2 d7 K) g9 ?; B" q
       Arrays.sort(properties, (a, b) -> {" K8 S8 M' ]3 s  }' s
           if (a[0] == b[0]) {
0 H& X' I5 d$ O               return a[1] - b[1];
% i3 W2 s: N; O5 f( r' A          }/ f! b5 k" x4 Q9 a) I/ G& T
           return a[0] - b[0];
1 q( _: z9 Y# U& X      });
, ^6 Q6 q/ G7 z$ q       int res = 0;
9 q4 J9 F2 U2 A3 M, T       int lastAttack = properties[properties.length - 1][0];% Q, {7 ^, y! F5 ~7 ]% V
       int lastDefense = properties[properties.length - 1][1];7 P* a0 d( |* g" w2 I: y
       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力
  q- h# m  t' K: M, S       for (int i = properties.length - 2; i >= 0; i--) {
) ^; D; [# H5 j3 U, _           if (properties[i][0] < lastAttack) {) A! n$ p* O+ q, W4 a" K
               maxDefense = Math.max(maxDefense, lastDefense);
! \: n% ?% X$ \' i2 b; h               lastAttack = properties[i][0];; ^; |+ d  O6 R* x0 a
               lastDefense = properties[i][1];. w* F( O* I" }8 F# c) d% |
          }
6 G, `5 e3 w. F8 O% Q, i+ L           if (properties[i][1] < maxDefense) {
2 E; o* b3 G$ n* y               res++;
/ ]* E; U! [3 e9 w8 @" N0 s& s) a          }
2 O* c  U: {9 d* j      }% P# V& o) y% S- C4 y3 s. i
       return res;7 F7 }  ^) a; I6 q. m+ Y/ N
  }) H% M& d, f7 ~& B6 J
}# w* z  {1 ^6 L# r  }+ b
0 U% F( `0 i: E. `6 [7 G& T' A& a
" l3 @/ Z0 J" y4 Y5 X
【 NO.3 访问完所有房间的第一天】5 d8 t  v7 |% ?4 b
; T- t7 @) K: w$ K' y) G
解题思路% L' D9 g. Z) [# e, ^
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。
. U1 T" j( _5 ^: R4 T5 o0 j, J& ?9 Z4 _. I& W
代码展示8 ?* v& h# F  k+ x( f
. Y. g3 Q+ Q8 a5 c' {
class Solution {& d7 \, a$ Z% P% {
   public int firstDayBeenInAllRooms(int[] nextVisit) {% R' V0 }) H; Q# p
       int n = nextVisit.length;
, \+ A5 ^4 m) j7 _  {: X       long[] dp = new long[n];/ \2 F: b8 |, l6 u( B' m  J
       long P = (long) (1e9 + 7);
8 Y9 S1 d0 W7 ~* I       for (int i = 1; i < n; ++i) {
* P& e: I, h$ k5 U           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;2 k4 g5 L/ G4 b* x' E3 b' _1 G
      }
/ t4 T$ m! {" ]. M9 |       return (int) dp[n - 1];
; B5 h. F4 e8 h" q/ p, T  }
2 ]: ~- P7 i  Z' _3 ~2 [4 t4 x}
2 P0 G9 k- o$ i( u. Z. Z8 ~
- R5 `7 m- G4 q  b" T4 m/ I【 NO.4 数组的最大公因数排序】" [5 ?4 o$ \! z" S7 C

* R! E: w0 h$ ^5 A解题思路
5 z0 @5 s( d1 V7 ~2 s: L/ |只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。9 G+ o# j. p7 W  w  R$ x
4 u* q3 }  E( o. Q; n% w5 e

" c, {/ ], _' J+ S( I代码展示9 Q/ L; S# b- p$ Z
8 d* m/ ]- y  i3 }
class UnionFind {5 w3 _% d8 ]& p0 A+ k3 U% L
   public UnionFind(int size) {
1 b& c# y. {9 n3 b4 a- e       f = new int[size];( i6 ]5 e/ a+ }* l- u
       Arrays.fill(f, -1);
( L( V+ J3 M* E; l  }: p6 `  p% t$ r, @( K6 R
0 T  F: d4 c/ U. j6 n
   public int find(int x) {
9 K( P( c8 }, G, d, F       if (f[x] < 0)' `4 M6 l0 U! I# p' B( y  H
           return x;
7 _3 C4 {) e) P$ Y) J9 b       return f[x] = find(f[x]);
  B  U$ b' L$ o( N$ N/ c5 ]  }
; X9 x/ Z3 U. w" b: b, y" K: `$ j. ~) @3 ]) P* j8 C; A
   public boolean merge(int a, int b) {
) I+ u! p7 c# |7 ?0 i/ n- A       int fa = find(a);
* S  l# m& @  P/ G! a% X. a       int fb = find(b);
# c& R. a) V& P0 b) R/ U       if (fa == fb)" R0 V- h2 @* K, }) l) K: F
           return false;' h. M$ R) H* N) }& Y& U, m
       f[fa] = fb;
+ x8 j/ B1 I- s3 W5 v       return true;  t& ?* ]1 z0 @. x$ {6 W$ N4 T  J
  }
" j+ U( B& w; ]2 I% d+ u# p2 u% |9 k3 d) ^! l2 M
   public Map<Integer, List<Integer>> sets() {
! G4 Z0 K" o4 ]       Map<Integer, List<Integer>> res = new HashMap<>();4 ]9 k  m' h% w: G& [
       for (int i = 0; i < f.length; i++) {9 ]& y; `2 K3 G6 ~; q+ a; Q
           int fi = find(i);
; F. }) Q. M  |  {5 n  g           if (!res.containsKey(fi)) {
' s% M2 K% |4 r  R+ r  Q               res.put(fi, new ArrayList<>());
0 ^2 a, t, v( m; G0 a          }
+ _0 X, p. }/ K2 [9 _           res.get(fi).add(i);
: ]# A/ j( W; [2 M% @  s# w' G      }
3 G: l5 c" ~6 j       return res;
( S+ V1 I7 ^# v; U) A  }
, p3 @: Q& W1 X" G
/ {2 f8 {; W, ]2 k1 e( {  }5 t7 q   private int[] f;+ B# q* x4 ^/ I9 V
}1 I" C7 x  I2 j, L5 k; ~

; W; \$ T0 m9 C( ^% \, l+ [2 |' s7 s! T# C% [, L2 M3 q
class Solution {" X) U, X+ o" u" V4 e8 D' E# i, S
   public boolean gcdSort(int[] nums) {
  ~% b4 V- E. m       Map<Integer, List<Integer>> set = new HashMap<>();
- v  s1 p$ C; A: s       for (int i = 0; i < nums.length; i++) {
, O* `% _0 P9 z5 ~           for (int j = 1; j * j <= nums[i]; j++) {
, B; i! k5 p9 J1 E0 r3 J               if (nums[i] % j == 0) {' q2 j4 d9 P4 t* k" b
                   if (!set.containsKey(j)) {/ e, R! a! e! e) c* n' |
                       set.put(j, new ArrayList<>());, d9 c  n; u& }0 [
                  }$ f2 a( @( T: r# T- r6 G2 e  w
                   set.get(j).add(i);
- Q7 u; z8 E: }. n                   if (j * j < nums[i]) {
, ]9 t; `! Z  ?                       int k = nums[i] / j;* v7 i2 i7 I/ w7 K
                       if (!set.containsKey(k)) {, h' P: c) V$ _: D
                           set.put(k, new ArrayList<>());( b. [6 i* v' Y7 a; {
                      }8 O! \1 |. B& G# X
                       set.get(k).add(i);
' A* H+ [5 j# h1 S# D/ k4 `' ]                  }
9 @/ Q/ n3 F+ M! [+ ~              }% X" c6 T( q- p3 v* j
          }
  L/ [& c" @  e; r7 _8 N9 m% x      }# }1 t" n4 t# e3 e) R
5 H  q5 T& p& V
       UnionFind uf = new UnionFind(nums.length);$ h7 x$ R& r( p* V- z
       for (var e : set.entrySet()) {
1 t' ?4 m0 B( F: K( J/ E           if (e.getKey() < 2) {
: H4 s( _8 W0 }  Z               continue;
7 W+ ]3 J7 Y. J6 g          }
9 N8 W4 D" v2 D6 F  B/ h+ [           var list = e.getValue();" K; I5 _) x, d# t3 [/ k" K
           for (int i = 1; i < list.size(); i++) {
& M% W" v+ J, g6 ]- l               uf.merge(list.get(i - 1), list.get(i));
* O2 R2 K* i2 i. M# L& p% K          }
7 e# I% b/ g. h5 E8 V3 e# z6 K      }; r  ^+ M. \0 G- G
       var sets = uf.sets();
" ]3 P7 ^5 h+ `( @" P, f+ M       int[] res = new int[nums.length];6 n5 h' m+ G$ Q! y2 w2 x- C
       for (var e : sets.entrySet()) {
- B0 J2 P+ R& s$ a$ b. E- u# ]           var list = e.getValue();
7 l! k* c/ R1 Y. c& ]( L# U' g7 X           var sortedList = new ArrayList<>(list);
# K' ^7 I, [/ F' X2 O2 g           sortedList.sort(Comparator.comparingInt(a -> nums[a]));, i8 G3 f% p3 P5 a  B
           for (int i = 0; i < list.size(); i++) {
3 T, T3 x0 r& L" `; L" v2 L               res[list.get(i)] = nums[sortedList.get(i)];
: U+ p3 L+ {" O1 R& u          }: B. G- t7 J' Q. t
      }
7 i% c- s9 d# Y- s. ^/ {       for (int i = 1; i < res.length; i++) {' b2 c6 F' Y" C; A/ P  p/ J! l
           if (res[i] < res[i - 1]) {) B. W* T8 b9 |
               return false;- a5 r# j( n% Z/ L) v
          }; R" \; I6 i, H7 H2 ~/ {& H
      }
0 E5 G/ ?6 O3 P       return true;
6 ^; Y- m4 M2 @  }5 |" N/ K8 G! a  J+ K* |; u
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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