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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计特殊四元组】
# g: h- s! ~+ B5 G  s解题思路
) |+ I5 U* Y  |: s& u. K! Z4 o6 j签到题,枚举即可。
3 G! h3 a- j* ~8 i" P
: l4 e8 s& _0 Y2 j$ x( h4 R1 a- }代码展示
+ B- W! y5 t, v% B5 \. {, w2 E& w  @3 R" x6 N
class Solution {4 |5 U6 V0 o" f) u( c
   public int countQuadruplets(int[] nums) {
( i  S% P4 j0 F: i0 k4 K4 {       int n = nums.length;( ~4 s9 h) O# G( c6 F/ z/ [
       int res = 0;
. K; v" f7 f8 w8 \, ?0 S: l       for (int a = 0; a < n; a++) {; v# ^8 W7 z0 t" Q5 R
           for (int b = a + 1; b < n; b++) {, z2 t: Z2 ]2 `3 u! N% i, A
               for (int c = b + 1; c < n; c++) {
# M# U% a- X' H. i8 z& i8 d                   for (int d = c + 1; d < n; d++) {, b2 {7 U8 A' X. u. h2 s0 i
                       if (nums[a] + nums[b] + nums[c] == nums[d]) {5 y! o9 n7 H) g  h3 I
                           res++;
2 n/ h( z8 Z8 P8 K  \4 z                      }# h0 E' E" |" d5 F/ ]4 D% ]
                  }  N5 q( L4 n' N  l6 D
              }
) A. P( }1 U7 `, G          }9 r1 z3 s3 H/ {; C+ q
      }
2 v: @: n( V) f7 Y2 G. [       return res;
" P6 V5 M9 l% }) d$ g  }$ Y+ P! i) E3 M5 J; d
}! ~- H0 @, b( q0 u. O
; g2 @' Z$ r: i4 [% F3 |
2 U) M# S  g9 m0 P# Z1 G; `. `2 G" I
0 m0 p9 d( Z; K0 J/ P

: E, J3 Q$ x% c; M* e【 NO.2 游戏中弱角色的数量】: Z2 q* w' O8 B$ a& D$ q3 ]
解题思路
* d+ u9 J9 m$ h, S" Y; l按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
5 e8 |! t) b; X0 x1 c6 @, \: e% Q/ X" B  H: W1 y" |
代码展示
- T$ u, c" t; h2 H9 I
3 q$ X: M: s. k8 C0 {# Xclass Solution {6 A; p3 F" Z+ G
   public int numberOfWeakCharacters(int[][] properties) {
& {+ M- o5 }6 k, r6 t       Arrays.sort(properties, (a, b) -> {
" P( u. W, G; V6 X           if (a[0] == b[0]) {
; d7 t3 V; @" P/ l" {               return a[1] - b[1];8 Y0 P% P7 ?0 c+ V' w$ c
          }
$ Q% I8 C$ F  K4 d4 `7 R: p- Z           return a[0] - b[0];
# |! l5 D: d; @# J' @% n2 K' y, w      });& z0 Y8 g+ n* {/ o2 M: w
       int res = 0;) t5 q! r. K, p+ N& r0 v( b. W
       int lastAttack = properties[properties.length - 1][0];9 u9 @$ e2 I& |
       int lastDefense = properties[properties.length - 1][1];
, ^+ E* x: _" B  s+ W3 ?1 B7 N       int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力: W7 j  b+ r! h" n# t* F
       for (int i = properties.length - 2; i >= 0; i--) {# w9 g& K$ N- {6 O
           if (properties[i][0] < lastAttack) {
0 L) y+ Q! e; H2 i               maxDefense = Math.max(maxDefense, lastDefense);
4 j1 |- E* {) V+ n7 A: {6 D               lastAttack = properties[i][0];
2 X0 h! f7 e- z" O9 Z" w% `0 m               lastDefense = properties[i][1];
0 L5 D: R# Y2 l8 G- f$ [+ A7 @# a- G          }2 _6 f. G" p' L+ }4 B  |, ~7 P; m
           if (properties[i][1] < maxDefense) {0 h1 T. P4 p) i( d+ [- P0 Q( j
               res++;
1 @2 d9 p2 i7 R! l/ y          }. N: a7 \; b4 f
      }
; B& u- P% _: p8 m0 y       return res;, Y( N7 p8 z8 r0 W) D
  }
& d$ ^# f  L) H}3 ^, \5 A# f& ?7 o9 D. l0 x- }  w
; s" @3 d* h4 S8 [3 {7 x
, L: H, I7 C5 C; L9 N# I+ R3 ^
【 NO.3 访问完所有房间的第一天】1 G6 ~2 R& a4 U! [0 C/ c

: T, v; A4 T2 M, X; Y: ^% F解题思路7 z. i4 Q  V: `+ g$ e) G
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。% c* k; c' i2 ]7 o1 f

+ L( t- C" ]) D  }" s: h代码展示& u: }  ^4 Q: [3 x' i
, L8 S3 P8 \" P
class Solution {
) i: o$ i% W& Y1 q   public int firstDayBeenInAllRooms(int[] nextVisit) {7 |- ]' }/ O7 E! y9 p
       int n = nextVisit.length;. t& A3 U) E- K2 p- N
       long[] dp = new long[n];
* M' O, P- ^$ m) {9 |       long P = (long) (1e9 + 7);+ g+ K: B+ @2 u/ t" r
       for (int i = 1; i < n; ++i) {2 c+ W, j/ T0 m7 l! I
           dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;
  V! m) t* `4 y4 m& s; a$ A/ a) C      }& S5 v+ X+ Y! T+ Q" @5 k" w
       return (int) dp[n - 1];. f" \$ p$ M# }
  }
9 i5 T+ A9 |0 n5 \8 A}
) o1 I7 q, p' L; F' j& {/ Z/ ~6 x* ]5 h
【 NO.4 数组的最大公因数排序】
' X$ B! t& {& v. x- q' I  R: Z! k. C1 D0 Y7 o" A* u( k
解题思路
1 Z6 V" n  T- C7 u6 U只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
" l9 q. ~) ?/ A' f% t" g
) c# `) |6 r$ k9 _2 A) K( d( x/ G' w1 V# z
代码展示
) Q! F% e7 V" ?* r: B6 ?! ^  }9 B0 N' |7 h0 J" \4 S0 T" B
class UnionFind {
9 ^1 e  K. D0 h9 \   public UnionFind(int size) {, ]! ]- r" m4 s2 J0 T/ ^
       f = new int[size];
9 f- C; T3 t) ~# }- e) m' `       Arrays.fill(f, -1);: B) y) [' i5 I4 d
  }
0 O4 E7 I+ T  {& b# {$ C; J7 ?9 h
1 O. f" `8 c+ c  k1 o4 E& I6 {) E: K. ~   public int find(int x) {5 ~1 M0 y. T+ W. k
       if (f[x] < 0)( k  ^7 j. P4 I0 i; A& n
           return x;6 ]! D* A. O% F6 k6 t: M
       return f[x] = find(f[x]);: [: b* N$ N% [3 N4 n& u+ ^
  }
, r) G" n: _! q- \" g. A! h; [  {) ~$ s
   public boolean merge(int a, int b) {
! A7 Y) y0 Z2 f7 j       int fa = find(a);& Z9 s2 d; k! L( |% t
       int fb = find(b);
3 i$ X7 \+ B" m" _* b8 s       if (fa == fb)1 e1 n% i! C/ w  M" r
           return false;" X2 W1 O3 Y* C4 D8 E5 E: x
       f[fa] = fb;
3 A7 Q/ N% p9 l/ J       return true;7 b; ?" W+ U# I. H1 N
  }4 U, J, K) g. ]

7 o6 B& ?+ `) [, ], {- l   public Map<Integer, List<Integer>> sets() {
. r! o+ V" z) G, e. f5 }9 q1 \       Map<Integer, List<Integer>> res = new HashMap<>();
  i( O; \& v* u$ ^3 `4 j+ e       for (int i = 0; i < f.length; i++) {  ]) s! q% P! f
           int fi = find(i);: B, ?6 c8 P  f0 o5 }/ x
           if (!res.containsKey(fi)) {
. o4 A1 @1 X0 [3 y& F! ?9 V- i               res.put(fi, new ArrayList<>());, e0 \; U0 `# `
          }
* h& L1 K- a$ l5 k; u           res.get(fi).add(i);
* c5 }0 t3 I+ `- D# U2 W- `& X      }, S. s# V& \3 t; G
       return res;
& d9 A+ C. H- Q) d7 {  }7 \- ?0 F' ^7 ]  A2 u8 W; q) [
2 ^/ m' m" w3 o9 Z2 N3 Y
   private int[] f;$ R: T' k# R9 @) t
}
1 ~" m3 T5 q1 }0 f2 d# y% Z8 m6 J* m4 D' S8 h4 l1 G

. R; d  d/ h5 {+ C$ G; u" b/ Jclass Solution {
8 u6 n( Y2 ?2 u9 I* B; {3 f   public boolean gcdSort(int[] nums) {) G6 |4 J# p7 r, K8 O% c
       Map<Integer, List<Integer>> set = new HashMap<>();
1 V$ W# `( l3 s/ }  X. n; z       for (int i = 0; i < nums.length; i++) {
- H4 n& n% Z" A+ Y           for (int j = 1; j * j <= nums[i]; j++) {
4 z5 O3 E! f( k7 u4 x1 n1 w               if (nums[i] % j == 0) {9 @( ]/ R* `+ ]' ?+ S2 ~! c* n
                   if (!set.containsKey(j)) {
$ f' z- Q3 \: `/ R0 k( N+ K                       set.put(j, new ArrayList<>());
# `) U7 u+ [9 e9 H5 i: J7 w  G& e                  }1 \* A) K9 w" `/ ]5 n4 M
                   set.get(j).add(i);
; k$ _% w0 q+ v% |& F1 B                   if (j * j < nums[i]) {
$ e& _2 h# s0 `: g5 J3 x; L+ w  t                       int k = nums[i] / j;7 u; U6 g! U; z% X4 a, S, x5 Z
                       if (!set.containsKey(k)) {' p# L  f1 p- K0 A+ @% w
                           set.put(k, new ArrayList<>());0 z9 @+ f5 j: g* i
                      }6 v9 D) t% Q6 N% c# m2 n  _' f
                       set.get(k).add(i);
2 m' c7 ^  v9 B5 D3 q$ T                  }/ p4 C$ Z. T) K
              }
' O' \1 w7 t# b  ?2 M          }/ D# D2 r6 q7 ~9 G/ M
      }
. j1 K, A; p' k6 S/ @- J; D( L: k7 i# a
       UnionFind uf = new UnionFind(nums.length);
% w. U8 M0 T2 ~: R       for (var e : set.entrySet()) {3 _+ F" i# j( v
           if (e.getKey() < 2) {
5 n5 P8 q4 L7 N: e5 ^               continue;
5 ?) r' U- A4 X  o          }9 o$ v" A  @5 }
           var list = e.getValue();$ e3 y# v# A% |, G1 ]( D; y2 V
           for (int i = 1; i < list.size(); i++) {) e9 k, ?! [( o9 \6 D  P
               uf.merge(list.get(i - 1), list.get(i));
( r0 N% \0 y& Q* B8 w  j          }
5 x: A. F! u! ^! {      }& N: q% h5 x5 q2 {$ R
       var sets = uf.sets();, r% U: |$ Z, n0 [, `
       int[] res = new int[nums.length];
6 m- H" i  u+ Y9 R5 A- `, {# K       for (var e : sets.entrySet()) {4 R  J0 G' v% c
           var list = e.getValue();$ h3 Y$ H' q6 O2 g# ~3 O
           var sortedList = new ArrayList<>(list);
% }# |: l! I" v/ u           sortedList.sort(Comparator.comparingInt(a -> nums[a]));& U! g* U. F& v
           for (int i = 0; i < list.size(); i++) {
: K, q2 e, c3 u. b/ Z# M# Z6 w               res[list.get(i)] = nums[sortedList.get(i)];
- Y: c6 d" D2 d! H. b0 d& e' A          }2 s6 ~/ e! v& n- N) ~0 Z) ?
      }, o1 M+ v9 ^- Y1 u
       for (int i = 1; i < res.length; i++) {
* m. y; J( r1 w7 C, H4 S( r0 F           if (res[i] < res[i - 1]) {/ ~5 E+ f# ~) y& K- H  I
               return false;4 Y$ a* e) K9 ?6 ~# M9 ~
          }
+ C' v* @: U" [& P# M      }
, I0 q4 k  E+ m8 y7 Q2 u2 l0 e, [( D       return true;
0 I& |( z6 g4 O4 X# B  }; x2 ^. Y6 {/ X; K' v% T; }
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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