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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计特殊四元组】
3 E! A! I' }4 E/ p' W0 p解题思路
. h: l, H0 q; |" ]0 l7 y签到题,枚举即可。
) l4 p! a  U$ t; {- [) ~4 ~
3 {5 U6 ^  i! Q: U( C4 s, d+ @代码展示
* V. A1 u3 |8 O
4 {) @" j1 v& D. _class Solution {
4 a' I! o6 h3 F, j   public int countQuadruplets(int[] nums) {
: V; I& s3 R! x" H" c2 f       int n = nums.length;
' l% M1 x* t8 k1 p+ O+ v" s       int res = 0;
: z9 M! k  }* }5 B+ l9 W       for (int a = 0; a < n; a++) {3 f: l$ t# o/ @6 L* n: ?
           for (int b = a + 1; b < n; b++) {
" x& [  G# }$ d, a' v               for (int c = b + 1; c < n; c++) {
1 u( C4 O; B$ l" s1 x4 b! S* L                   for (int d = c + 1; d < n; d++) {. T) X& g" f" C3 `$ H6 A  n
                       if (nums[a] + nums[b] + nums[c] == nums[d]) {  B' q9 `2 z& Z; `; l: I
                           res++;7 c9 M- g; B: v( {8 D8 p7 T- l" J& |
                      }1 r" _  f* Y& X6 w+ g+ W
                  }- Q$ v, |% p% r3 }
              }
' j4 Y5 m* q5 f8 O          }3 X& a) B$ T+ w7 G! W
      }, D  W! c# T; D' s9 t
       return res;
- Z0 ?" s+ c' N+ x7 @: k  }
) P8 V% S# v7 Q. g}
! z/ C6 q' l5 ~4 s( m0 u
/ F$ k6 N3 A7 v6 g0 W+ z
+ }, o3 [- I# E0 A; X& L, z# ?% ^

! |2 f" p; f- J) w【 NO.2 游戏中弱角色的数量】7 s& ~- x" s  Y9 |' P! S
解题思路! r1 Q# Y# X% }- s6 @$ w0 @
按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
/ ]1 Q+ L/ z$ h) v9 ]0 o" P- u! @7 _4 v* p
代码展示
4 @* S) ?" J8 \( h& W, U  w9 \" r/ D, W, Q; n) }6 G3 S$ W
class Solution {/ `# B; T$ k8 `% F
   public int numberOfWeakCharacters(int[][] properties) {7 C& @4 J" Q0 x4 q. }: r9 F
       Arrays.sort(properties, (a, b) -> {
8 a' z( e0 v) w1 I           if (a[0] == b[0]) {& R$ n( e; R* W+ O
               return a[1] - b[1];2 d! G5 c& w& t
          }
- [$ s9 C8 b  ]& r4 \1 H+ Z7 \0 i2 n           return a[0] - b[0];
% n. q" Z4 F8 [- D* ~% v      });
# m9 i$ K8 c8 K! m) X; C       int res = 0;
1 |' Q) g" d& S9 h7 e9 z       int lastAttack = properties[properties.length - 1][0];
- |; ^' o8 {% q3 I' h1 j1 }       int lastDefense = properties[properties.length - 1][1];+ ]- X! H' V! a9 c7 W+ e6 D+ P! e
       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力0 D6 I+ f4 N  O( ?# F0 g
       for (int i = properties.length - 2; i >= 0; i--) {
: _! p+ \) e8 g8 @' C4 e- w           if (properties[i][0] < lastAttack) {5 p# |) D& d+ A! b9 h' K) T; `
               maxDefense = Math.max(maxDefense, lastDefense);% i# Q4 V; S  e- Z: P! }+ J5 V
               lastAttack = properties[i][0];3 K3 @1 s: X/ K
               lastDefense = properties[i][1];7 D5 d# f6 T; Y5 L4 p2 e# g
          }  j) O* O9 y+ r; v8 ~! I
           if (properties[i][1] < maxDefense) {
' K" z7 t3 G0 h               res++;
7 z. F+ K7 f, m2 x          }9 K: T' P/ ^5 u/ H  E2 [! _
      }
( a: `. _# w+ n$ I, w- {, K       return res;
% }" X; P$ t' J2 M7 ?3 h  }* Q( X9 N& p* b/ b/ `
}3 e* h, r6 }; S2 d0 @

9 L% i8 b: p) ]9 i  g! ?
# }$ {* f- j+ s: k【 NO.3 访问完所有房间的第一天】3 Q, {( g  ~( R+ d

, `) [8 S! u* \. R+ o解题思路0 t: `: J! l( m& L! f* }8 u2 N9 Z
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。# t( _! }  F" ~4 Z- {6 X: W
. C: Q+ l* ?  Z5 A, X7 Y
代码展示
4 N- L: e% ]$ l/ C% r  {2 y1 ]% N7 I. B) x( E
class Solution {
1 q* ^% \$ G6 I$ r   public int firstDayBeenInAllRooms(int[] nextVisit) {( `5 `( m$ z1 W# ?4 |7 H0 d
       int n = nextVisit.length;
; U# P" z6 \. B7 q       long[] dp = new long[n];9 v2 @& |, z' m/ |# M
       long P = (long) (1e9 + 7);
$ ?1 f$ s+ [4 d/ k/ P       for (int i = 1; i < n; ++i) {
5 g) c' u) Y( t1 [3 @* f* b; d           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;  C. i, b: K6 D7 a+ Y1 W
      }
1 J  v/ h  V1 F# ~! P1 X       return (int) dp[n - 1];
! Y$ W5 l4 s! b. p. m  }
9 t. z' i- l  X* u1 q/ u% G: u9 Y2 K7 ]}4 k- I5 |( m' @* Y0 E( }: `3 s3 q8 Z

  V6 \3 E0 E6 Q- k6 P【 NO.4 数组的最大公因数排序】9 z$ t; i' J; b
1 z; }1 I. d5 G2 d" T1 q& ~1 v
解题思路2 z& @# F: A+ M3 A
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
' _7 u1 C2 z9 D) o5 J* G$ v
% \2 }, A( F4 H
7 {; a- T" D4 a8 W' q4 r代码展示
6 L' Y! E1 N! ?5 T1 [
0 |8 l6 t" F# I" C1 i' u! n, iclass UnionFind {
' y/ T* }  d7 T  ]5 z  s- F   public UnionFind(int size) {  f# r% [: _& @5 S8 [) y5 q# {1 C
       f = new int[size];
% ~, E/ h" y+ I$ P1 j! J: D       Arrays.fill(f, -1);" Z" E, f  w8 _* D' h
  }5 j/ G" q* ~7 p. V. q

' K! G0 W( R: N, y. i  M   public int find(int x) {; ^0 p% k1 S$ |: n# w* X
       if (f[x] < 0)
5 l2 V) L0 X0 [: Q+ H: q. u           return x;
! v' D0 w- T' Q9 m3 x       return f[x] = find(f[x]);- R+ U7 s# R1 A5 }- [/ H! a/ _+ R. }$ b
  }. J9 S1 Z2 S# q7 m  K

2 X, M; b" R# L2 j  [   public boolean merge(int a, int b) {
( x# P, R2 w- V- T% @7 v       int fa = find(a);
7 Y, q5 W" m# [- P0 m       int fb = find(b);' M+ C( o2 Z8 l: x
       if (fa == fb)
$ C* P: Y) P: m+ f           return false;
2 @8 R9 }$ I+ m7 d3 o' l: T0 ^, c       f[fa] = fb;
6 H' K" t3 R, p5 w" K% B       return true;* a& C$ ?- z" G/ d/ J, y
  }% {% ]9 X3 L  [3 }
$ y+ h' z. }" c- E( P7 ]
   public Map<Integer, List<Integer>> sets() {
  G$ e4 {3 x8 Q6 z       Map<Integer, List<Integer>> res = new HashMap<>();) F1 q2 C$ I6 X
       for (int i = 0; i < f.length; i++) {
& v& C3 F1 s, |" N" c0 j) Q: b% e; u           int fi = find(i);
" y* I  `+ ~2 ~* ]9 }$ E" Q8 X5 ]+ _           if (!res.containsKey(fi)) {
1 z3 a: q" W9 ?9 G- C1 ]               res.put(fi, new ArrayList<>());) H9 ]4 Y. F' f
          }
/ t6 n3 `# b, @; ~, Y" h           res.get(fi).add(i);& [! H2 C8 U9 l0 e  t3 d4 ?: T
      }
# D' F9 a6 T& j; b+ {       return res;4 u4 ]( Z6 B8 e( e" Y
  }
- }2 E6 q0 h; J% ]$ ]
, E8 F' J/ J8 F4 ?7 ^3 @8 I6 }4 J  z   private int[] f;, R0 Y5 @3 K* q& ~9 o$ _
}
% e) U) y4 v4 D; s
4 W% a. s( A( M8 |2 Z
6 s1 s2 L3 T' n: B: O4 C0 R" `class Solution {8 x, `- f9 n2 {2 d& n
   public boolean gcdSort(int[] nums) {6 D5 e# S" \5 S: Z+ D& q
       Map<Integer, List<Integer>> set = new HashMap<>();
  K4 {; W1 Z3 o8 O/ k       for (int i = 0; i < nums.length; i++) {
* F2 X5 O# N1 [6 u           for (int j = 1; j * j <= nums[i]; j++) {
/ L3 j$ v  d) R* f8 ~               if (nums[i] % j == 0) {
1 a! T3 D; |2 R4 r                   if (!set.containsKey(j)) {( h" L, _& V# d9 [
                       set.put(j, new ArrayList<>());
3 x+ i. ]/ q8 O6 R                  }
! b- f* O2 x' F% j0 _2 H                   set.get(j).add(i);3 \9 O3 w, Q, ]) [) {3 ?
                   if (j * j < nums[i]) {4 z" h9 }+ @4 f
                       int k = nums[i] / j;
8 S0 i7 W$ ]; ?5 n1 e                       if (!set.containsKey(k)) {6 _- A" q2 l" K+ W, n. C- d; X
                           set.put(k, new ArrayList<>());
3 ^( m4 |' G% I                      }
5 S$ k1 b. Y5 s2 M, [                       set.get(k).add(i);
! j$ p' h5 ~, g2 a1 s                  }( X6 P4 C/ ~$ D$ p! [7 A$ I
              }# Y4 f# F- v' s$ h! a
          }- z0 E! `6 w: `/ _
      }: K6 L- V" n& P8 ^! d
7 _5 ~1 Q! B) m, W. U6 u4 n
       UnionFind uf = new UnionFind(nums.length);1 g" e% }$ Q: @/ {2 {, C
       for (var e : set.entrySet()) {! v8 {- _. i0 \$ P
           if (e.getKey() < 2) {
  M' w; h, `) V( z               continue;
4 K7 q: X8 C: Z# E5 C' _          }& ^* @/ f1 h9 k* R7 I- W
           var list = e.getValue();: S+ o2 j2 m7 I2 d9 _+ K
           for (int i = 1; i < list.size(); i++) {$ G: _: f. m: Q: Y+ |5 ]
               uf.merge(list.get(i - 1), list.get(i));/ D  E* `# ]7 i/ A
          }; b4 M! L+ P$ S/ N1 C6 [2 M& D, M& I9 L' L
      }
, _: l, y4 R/ D* A% @' I; v  D       var sets = uf.sets();+ O: Z7 B8 H& F9 }3 M! ]
       int[] res = new int[nums.length];
4 ~" E+ ~% n' b( v2 V+ v6 g9 R       for (var e : sets.entrySet()) {% i. i; P: Q( b. A* X3 C" i' z
           var list = e.getValue();
" e$ O1 q  M& P           var sortedList = new ArrayList<>(list);+ J/ ]* e, {+ C0 F% {
           sortedList.sort(Comparator.comparingInt(a -> nums[a]));- f1 _$ A- }' ]
           for (int i = 0; i < list.size(); i++) {7 L' u2 s8 ^# A" p+ D1 O7 S' g
               res[list.get(i)] = nums[sortedList.get(i)];
$ o7 U% y8 `2 ~# A9 B          }
6 a) B, S! _, O$ o      }" w# {: C% N. F: @  B1 j6 R% L0 W
       for (int i = 1; i < res.length; i++) {
5 A! L& a* j# ~) x3 X           if (res[i] < res[i - 1]) {' {, M, v: I0 ^2 M
               return false;8 d9 P8 u* i+ r8 I
          }
4 C1 D. `1 l& |( }      }
8 a4 g2 r. z; y7 o       return true;+ y- v# D* m/ k6 y2 d, c  u' h) D
  }
9 R1 M! n: H: D9 x; i}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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