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

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

上岸算法 回复:0 | 查看:3141 | 发表于 2021-9-12 23:22:37 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】
1 A8 c5 g8 u# [: x, L
- v3 q/ ?& ]7 E% v4 |6 V' n' r& e解题思路- I( F; B; w! W: l0 ?
签到题。& a1 D! I9 N" a% |3 A! e
( ?1 c5 O$ I2 n: }0 x  _
代码展示
6 h% b6 R0 o1 x0 x6 G, p
% l. ]5 u& u1 o" Q: F% Qclass Solution {6 L# K6 D: }& Q
   public String reversePrefix(String word, char ch) {' u7 p: E1 i9 ]1 @  f6 I
       int index = word.indexOf(ch);6 _; J8 i, l) h2 T9 s' l
       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
+ Z* g" S4 ^# ]% A               word.substring(index + 1);( Z( k! f+ k+ o% x3 `$ U; d& a0 O
  }
( ?3 g0 w! }. y& V6 e& y' _9 b/ L}
1 L1 S9 a9 `2 |6 v* j
+ k+ Z+ X  b9 \# B8 K! t; D
/ i4 c* e) T( c! \: X: e
9 @: _: S- C/ A8 h9 F( M! u9 x
$ E* e' D% ?# h2 n) a  y6 D0 s【 NO.2 可互换矩形的组数】/ n8 }$ r7 b4 i" |
  B" D3 [2 [+ g- u% I; W5 Z8 L, R
解题思路1 F8 n. S8 L, x% X* C* d
将矩形按照长宽比分类,计数即可。
6 B# F/ A8 v/ r. ^& [9 p  W3 ^) {5 M# f9 r* _
代码展示- C. m( O" Y* `/ ^8 [# x- e9 b
) X' ]! M- F: n# Q4 e6 n
class Solution {
9 A1 u/ L1 {' L, [   static class Frac {& O6 j# F+ b% J7 m% T" f* O
       int den;7 ?- [, s  q+ [, q+ Y# B; [
       int num;1 @9 K$ `- ^& L8 U+ R

# \" U) B0 C, s+ |" g3 b       public static int gcd(int a, int b) {
) H( H" L' ~  s% w: l7 W           return b == 0 ? a : gcd(b, a % b);
0 y# M8 Q$ F) W7 d& d. S      }. I5 }& J% z# @+ S0 ?

1 C2 y2 Q* Q2 J+ S# l2 V       public Frac(int num, int den) {: Q& R# [. D( M+ R6 A
           int g = gcd(num, den);
, E* t! @7 E# H$ Y; r           this.num = num / g;
! C& q1 f# {& D$ n' |, D5 w           this.den = den / g;! `8 E, a1 H( b$ ?, Y# o
      }
* m( R' w" E' f3 q$ c% r% ~8 {  J% `8 z, ]  o- c' a
       @Override. E9 i# ?4 v: n2 e( {; r5 Q5 B
       public boolean equals(Object o) {) S  ?: v. t) M) f% \3 Y( E
           if (this == o) return true;- n  U8 R( D2 i2 ?/ M
           if (o == null || getClass() != o.getClass()) return false;
- S* k' h/ B1 T4 N, K           Frac frac = (Frac) o;3 Q+ S5 l4 _4 b4 B6 M" W
           return den == frac.den && num == frac.num;" U0 K4 g: H$ ]7 y& V5 y
      }7 z( t+ B) }. Q2 m: H% J
/ C$ n( K- A4 \
       @Override
" i4 v) B, \. G9 W+ r2 j       public int hashCode() {
! a! ]( r/ U" p! l1 k- W           return Objects.hash(num, den);
3 j$ f, |( }8 n" X; m2 i      }
6 d; L# E3 ]6 P* w  }% \8 K/ k: [5 U& ^

6 b" Z9 |7 k) b0 t7 a' a   public long interchangeableRectangles(int[][] rectangles) {
2 R; B0 j: s/ J       Map<Frac, Integer> count = new HashMap<>();
3 q' |3 }) y  [- _$ X       for (var rec : rectangles) {9 ]: m, F( y( A' i1 O1 d
           Frac f = new Frac(rec[0], rec[1]);
$ F5 J8 A, s# y5 ?6 [           count.put(f, count.getOrDefault(f, 0) + 1);" e4 S5 Z; ?; H
      }
; ~" C/ I; K6 f" M- A. m; m       long res = 0;9 `3 D$ @6 h7 N' E
       for (var k : count.entrySet()) {& y" w1 Q& ?/ s, c4 ~6 w6 a
           int v = k.getValue();
7 @1 a0 e# [/ J- a, p6 M           res += (long) v * (v - 1) / 2;3 j* w8 X* N0 t' D, C6 K3 x0 ~& y' ~
      }( w0 a5 P. k' W( X$ }
       return res;8 ^5 a0 j; x9 l* u' j8 ~0 b
  }
! P' l; x( q& @  l9 w}3 w$ S6 r3 y: V; m/ k7 `9 s! Z" ?( k

  B6 I; R2 |) n- N3 T7 h& P
8 [9 X1 a- t2 t. K【 NO.3 两个回文子序列长度的最大乘积】1 k  h+ H0 _# @- \, v* Y+ K9 A, K7 g
1 c. b/ p2 |1 [; H% Y
解题思路
7 ?. @& K# Q; b* P. {6 K& O暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
3 ?. S5 d, M% c" r" \
- u. X& O# b7 z5 J: h代码展示
0 a6 c/ r8 s7 r* a% i  P  k( v4 X9 b: \7 A6 m
class Solution {8 i, U( I- _4 t5 E
   public int maxProduct(String s) {) Y+ P) f8 S) H( u
       int len = s.length();- p) Y1 ^8 B1 z! l
       int res = 0;
/ p! y6 j$ P7 u( `; ^       int[] mem = new int[1 << len];/ R* ]6 I/ S' v
       Arrays.fill(mem, -1);, T& o. c5 u. q5 ^1 q; }. ?
       for (int i = 0; i < (1 << len); i++) {  s( |$ j* B" ~5 h2 R" p
           for (int j = 0; j < (1 << len); j++) {
( F1 q" U- X$ [+ i6 j# j. ]- H; M               if ((i & j) > 0) {
7 d3 g6 f( {: r& ]# @. h6 [                   continue;
1 u& o6 C$ J1 _0 w# x- c              }
" H% z- J/ `/ _3 ?: m5 N( Y               res = Math.max(res, length(s, i, mem) * length(s, j, mem));! _/ L: g% [# f8 p& j3 p; c
          }- e( J; Z# s- Y, _* U
      }
' I1 c0 f5 }, |. `( l       return res;/ Q; ?: \$ [. {0 W
  }
0 _( E; H8 m5 d) C2 G+ i* j# e% o3 ]3 S- d( b  |8 x
   private int length(String s, int bitset, int[] mem) {
% I; ~9 g+ q: y       if (mem[bitset] >= 0) {& s, P  p: g) Y0 r
           return mem[bitset];
( q& U# z! e4 i2 U( J0 J5 f9 P      }
8 j- N# Z' s' A+ P% Y: O       mem[bitset] = 0;) t# V2 A8 N$ r) T& L6 e7 n/ Y
       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
3 \2 ]6 X$ O, f6 i           while (i <= j && (bitset & (1 << i)) == 0) i++;: @& y3 @1 K" }8 g' N$ Y" Z
           while (i <= j && (bitset & (1 << j)) == 0) j--;8 k6 W* M6 a3 _. R
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
$ a" i  F$ P* ]% _4 q) L  j9 f8 H               break;
: c+ H1 @5 E' b/ t" ]9 V          }
! K% `# k3 w6 t2 w) v3 i           if (s.charAt(i) == s.charAt(j)) {- E" y0 @9 ^4 h  g8 d% C
               mem[bitset] += i == j ? 1 : 2;
- |4 j0 Y! c% Q3 j: W+ f          } else {
6 Q7 K% c5 z5 p& r- V" {               mem[bitset] = 0;
& r& ^% z- n8 K( o3 A               break;
6 {7 X+ a. }, H( W8 S          }
* M+ t( Z6 r8 i4 M      }
( t6 ^' d5 P, g* U       return mem[bitset];
2 M1 L: u* q" j5 g1 F" G  }
4 O# S7 o. G7 [' l$ k) p; b! R}
2 U9 w) X1 l5 y# V3 y+ p  m+ P, p3 y/ s0 e
, m0 `% `* p" H/ f# X; s
【 NO.4 每棵子树内缺失的最小基因值】1 u6 E  a) k* S, J+ W. J
& L# [" a$ L: x& y3 a
解题思路
; V  Q% e; O7 G: `8 q& nDFS 合并 Set 即可。但是有两个优化很重要:
3 Z8 N$ y: w6 u5 v, f! q! m3 }/ j- _
1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
0 B4 _. d/ J3 d8 G; w* [
* F( S7 s4 ^: i- h6 ]& e- i2. 合并 Set 时由小 Set 合并到大 Set 中" I6 A. z- d! F* h+ ?. D4 J5 }
5 F8 j  U( t' u( z) x& I% T5 g! _

  _4 R$ X, |* d0 s代码展示
! s5 c" }7 c1 L. c
/ A* ?. Q9 s' {! @* dclass Solution {
, Z/ d/ h- i0 H' D3 i* U' K( p: i, J   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {
% u" I' r  C& u0 H       Map<Integer, List<Integer>> children = new HashMap<>();
$ l& h+ B) t( g3 z0 b3 G7 |       for (int i = 1; i < parents.length; i++) {
7 d( Q9 [' {8 Y3 z3 e% b           if (!children.containsKey(parents[i])) {
. m& Z% H, V* a2 s/ n5 [               children.put(parents[i], new ArrayList<>());5 T0 W) \3 `, v( w
          }, e& j, y, ?  \8 e/ ]
           children.get(parents[i]).add(i);: g' @0 H! l; E7 M# l* y1 L
      }: g. |0 Z, P6 b/ W2 {( q3 l
       int[] ans = new int[parents.length];
9 e3 Z, K7 r2 J1 w2 U6 q3 f' L       dfs(0, children, nums, ans);
- W( K- B& s; c+ k& {       return ans;5 R7 r% X$ F  F+ }" H& v
  }, Y/ ^' S5 J# Q4 `; w
% K- p4 ^0 v& r8 t
   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {8 R/ k2 T$ z/ a
       Set<Integer> set = new HashSet<>();
$ c- S9 J4 F$ L. {  {       set.add(nums[cur]);3 Z0 E0 `2 s$ U& i7 E; B3 X4 f4 O6 W
       if (!children.containsKey(cur)) {
5 o" w9 \' `3 E3 r# \1 A6 U6 E1 c           ans[cur] = nums[cur] == 1 ? 2 : 1;
& }: H7 Z% O% C           return set;: y/ i1 u# W4 [
      }
; u! w/ b. \0 D/ R& M       var child = children.get(cur);
. H( P: w- h5 u: r& G* M2 v       int start = 1;) s& x1 k# K! o8 M$ s& _5 C
       for (var c : child) {- N. d+ l8 w$ r; Y( I
           var r = dfs(c, children, nums, ans);
$ w* @4 f; l+ `6 U! H* H. P: |           if (r.size() > set.size()) {
8 y, \1 i* w8 ]3 l. n* N               Set<Integer> tmp = r;' {6 e/ k# E1 r* @8 e- p8 e% B
               r = set;
8 ^4 b0 v& C& |" u: L3 }1 u               set = tmp;
4 L1 ^- X9 y7 z7 y7 T5 |          }
" a1 {) j: a1 ~8 w8 n7 ?           set.addAll(r);
, P3 Z/ ?. E& V2 g9 Y7 X% g           start = Math.max(start, ans[c]);, X! z7 Z, D! b4 K! q9 l' c* z
      }# S3 o) s  ]% A; s  f! \  l1 W; z
       while (set.contains(start)) {' V2 p* z+ \, Z0 u! B+ q% t& C
           start++;3 V+ P( H4 _" a- }' Z2 k; T
      }9 l& g/ M2 v! |  f' t  Q! e
       ans[cur] = start;
7 M4 a9 m: l# p       return set;# G* o7 N5 I: O' ?4 d% B2 b
  }
, b, L2 F( y0 x# P" E}
# \7 D( ^1 X. x, q
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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