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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】2 d  v0 m. ^/ @& Y* @

" n) y: Y! q- f- t9 D解题思路
" z$ b" ^* q7 X4 J" p签到题。9 M' V6 }1 e% ~

' C$ @% D8 ^" @  O/ B代码展示  C) f& [! r' _/ R; H1 t2 Z; x" U! ]

: Q* I6 P9 K1 Z( j9 i" T3 }8 V7 Lclass Solution {
7 i: K: L9 x- a" k4 m   public String reversePrefix(String word, char ch) {' }+ c$ ^; B: D  O+ b& q' J  T
       int index = word.indexOf(ch);
+ f. D% j# T) H7 X. G7 M' Y       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
2 _; i2 N% v4 i7 H- s& F3 I0 h               word.substring(index + 1);
! B) u9 r- p. m5 o$ k& ^& s7 [5 E: a  }7 P# a0 w# Z* h! Z2 e* i
}
7 D0 A6 M1 D0 r+ M- E: z
  ~  ~" A% _) l7 C
3 ]3 K3 V4 m/ {  w. R( F0 z* {0 Z* Z5 _" N# N3 i0 w$ ~: O1 ^

) D, a- o, d5 \$ ~0 z【 NO.2 可互换矩形的组数】
) W, u0 \0 w  n) k; v, T6 g' _7 H4 U2 t: O- I: W! E. G! k; D
解题思路
6 }6 q0 \7 G! ]+ I' |将矩形按照长宽比分类,计数即可。
3 K% L# c& j+ {; _8 Q6 t0 R
6 G# H$ ?: V5 f: j; w6 ^$ n代码展示
* a/ P' ]$ Y& Y; @* r5 j( L
0 s+ m7 a4 ?( z1 e1 Z1 Wclass Solution {/ _9 k" {2 z1 D
   static class Frac {
" P! A- m! B; Y5 {# ~  K! p       int den;
; U4 ]& I7 u) j       int num;6 e- |/ I1 F2 G+ |4 p5 b

  W% S& n" `% i& k& d, L0 |$ ]       public static int gcd(int a, int b) {
1 s4 N8 l$ m4 s% q           return b == 0 ? a : gcd(b, a % b);9 E2 E$ ~; F0 a" U: y
      }
6 ?. E* V7 m% ^+ M5 [+ c
* ?9 s4 V) k: o! R+ W       public Frac(int num, int den) {
* `9 K0 T! W' J/ a* @6 S( [! ?" ^           int g = gcd(num, den);
1 K0 ~' X' `5 F7 _' t2 b) o           this.num = num / g;, B& C& ^9 Q3 `$ a
           this.den = den / g;. B" j" X" ^' w9 H- Z* Y+ L
      }
: j& {" x$ \( S7 N* _3 x2 Z7 b# |2 i. ]2 v  V+ O1 v6 ^
       @Override
% t' r, u  m( l! U       public boolean equals(Object o) {
6 O, h: A4 }4 j2 V) V, Y$ y/ ~' o* j# J           if (this == o) return true;6 f) A+ y- l% W" u; t
           if (o == null || getClass() != o.getClass()) return false;
' C7 w+ ]; |7 S# S& U* n           Frac frac = (Frac) o;
* q* J$ G; [1 l. Q           return den == frac.den && num == frac.num;  y6 g6 ?, I5 O! S5 ]8 a" p
      }0 I$ Y  c! B1 W$ s  A5 g

" H$ R# X8 |/ n# P* @; l       @Override
' e# R1 I: O9 T# D  P' v       public int hashCode() {
' ~2 }* N: Y7 ^" @& F# \           return Objects.hash(num, den);
. U) ]* x5 x- b2 Z# e5 ~2 i      }* ?( v- A0 W3 D" N3 {! G
  }
. e: P/ e! b4 s5 ~1 `2 {6 f) ~
& H* F! X" t' y4 N  W) `- @5 o   public long interchangeableRectangles(int[][] rectangles) {$ t6 B) n: j, e4 L% \# o# M
       Map<Frac, Integer> count = new HashMap<>();
% [1 b* D/ A, C/ A  c       for (var rec : rectangles) {
! O0 V2 Z( Y( Q           Frac f = new Frac(rec[0], rec[1]);
. ]3 \; z# k! S) X; U) G9 y4 {           count.put(f, count.getOrDefault(f, 0) + 1);
4 k* `1 c0 {9 `- h" ^: I      }4 L8 P% b# v$ C
       long res = 0;/ t# f9 |( u/ b* a  k
       for (var k : count.entrySet()) {
0 h2 r; Q5 h$ k# ~; Q/ o0 O% D           int v = k.getValue();
$ M/ }& U+ v" h& k; U" B* v) F' P; g           res += (long) v * (v - 1) / 2;
2 G: [2 P) D+ A$ y* [      }  T! b% O( P2 ]2 N8 t# a6 @
       return res;3 U, A2 X/ r: U9 ]7 \& a' w% _" l! p9 O
  }
* m' L+ y) u+ U0 _4 l}& i6 p) J" y# p7 y+ k
7 p$ S1 Z* |0 }2 _) k. q0 c1 H
& h; b2 g( K: {2 @" Q: a9 e: Y
【 NO.3 两个回文子序列长度的最大乘积】
8 g6 G: G5 m7 U; }- W
; e# ~) U9 q- G3 n, G+ n9 [7 j解题思路
9 v2 A4 r' q- B. W暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
) M2 ~6 ^8 k% X8 C: T; F: \8 x! {( Q; S+ E# M5 y+ \1 r
代码展示
2 b4 [5 U% G( K% N: i* j. y5 K* g/ i1 }+ h% b  U  K
class Solution {7 N3 ^5 M; Y2 b! }
   public int maxProduct(String s) {
+ V) t; |* A. h4 G4 A+ N       int len = s.length();
  I/ g2 T7 J* {) m' ~3 y       int res = 0;
1 D+ z( g  L2 n. f5 A       int[] mem = new int[1 << len];4 r2 l' f1 V8 K4 X3 t5 R# V6 E
       Arrays.fill(mem, -1);% [( M( A- l" `5 f) s
       for (int i = 0; i < (1 << len); i++) {3 Y( M: M! L# h
           for (int j = 0; j < (1 << len); j++) {5 ]" T5 ]" ]0 P  z8 x; |1 X
               if ((i & j) > 0) {" b+ O8 ]' D8 A: a8 A  v, x3 ^+ l
                   continue;
/ E* O# `; I; Q( ^1 h              }
5 b% P, G3 p; w2 D( s7 r" [6 e! z               res = Math.max(res, length(s, i, mem) * length(s, j, mem));
% }& n' c5 v# R+ z$ j5 O& O          }! Y* S7 Z0 }( x3 y
      }- w8 W- F0 e- S3 ]$ n$ A
       return res;( p$ i- I4 b( G& A: w
  }9 D- e2 y& d' @! V" `+ s+ B

7 \/ z5 W; Q8 t) M; b  w7 B* f5 n* K   private int length(String s, int bitset, int[] mem) {
- X7 I9 C+ H% [% |6 |  f. [* z6 @3 ]       if (mem[bitset] >= 0) {1 O- T% e$ P$ r0 ]: r7 y
           return mem[bitset];
/ \0 U( E8 l& m" D% G      }- l2 [3 ^, O+ h8 a' H0 T) I
       mem[bitset] = 0;
8 U) t$ u/ P( \# {4 S       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {7 E7 g. I4 }8 Y8 R
           while (i <= j && (bitset & (1 << i)) == 0) i++;9 V8 D" m& t) p. u1 {& |; t7 I7 Q
           while (i <= j && (bitset & (1 << j)) == 0) j--;1 q$ I  v  I$ P( ~' o
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
& t) ~2 F$ W- |3 X, U               break;
& ~! V% s, z5 j- Z          }6 ~/ F9 a+ x8 C$ A5 j+ R
           if (s.charAt(i) == s.charAt(j)) {. p* d; P+ ?0 K3 A
               mem[bitset] += i == j ? 1 : 2;  B  e' s$ F' C
          } else {
' @! U9 w& G3 g  c. C% d               mem[bitset] = 0;
- o) \* }( V  o2 s               break;
2 C4 i$ b% |% ~+ j; R          }! K7 T% D5 F7 }" p
      }
7 N6 g' G1 F, ~5 `: K2 C       return mem[bitset];
2 J0 y; m5 R5 h  }
  Z" }5 F& T4 O0 z. e, r}
! y, U6 m8 q5 S+ a  p% `8 S
$ Q( K' [; @1 I0 h0 n  i. F1 i  S, D1 X5 c4 p) ^! V9 L& B# p& Q
【 NO.4 每棵子树内缺失的最小基因值】. @1 H* V/ B: ^

8 e9 `! _0 V: j5 N6 \) X' {解题思路: w9 h& }! s  ~( y
DFS 合并 Set 即可。但是有两个优化很重要:
/ J$ q- o  r# |4 z; v( M3 Y& Z8 J; X
2 [' U9 ?, V( g' A6 q1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
) @6 W0 _) o7 g! l. S
. o' j, v: ]2 e3 z2. 合并 Set 时由小 Set 合并到大 Set 中3 w  v- M- Z+ i- a8 ~% c' e) S

$ P3 R7 \) W  X% U+ G3 @2 J! R
( q: V: G5 t; _. ?. q; v1 m% f9 J代码展示, x! i4 `  d% d& Q
. s/ J1 u6 W! t9 V, U) Y
class Solution {* Q9 N, Q+ z. H- _2 ?# k# p
   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {
) v% d; J0 j+ k. _0 M/ l# c       Map<Integer, List<Integer>> children = new HashMap<>();; {7 x& U3 x  j8 z' l. Y
       for (int i = 1; i < parents.length; i++) {
3 {( i: F! f% H; C           if (!children.containsKey(parents[i])) {
. ~# @% `$ ~; a, g               children.put(parents[i], new ArrayList<>());
; a8 f$ g& N% b4 E1 l9 Z2 |          }: R2 H  }' x" N2 N
           children.get(parents[i]).add(i);% `/ A+ g6 o- [) M
      }# t& P; X% ]' J1 e
       int[] ans = new int[parents.length];
! t8 ]6 [1 ?- h0 q6 f" K+ }       dfs(0, children, nums, ans);
2 H0 l% d' m2 L% d+ I" I       return ans;0 f/ A6 D* B, W
  }$ h: J' ?- s% S! \

- B8 q1 _; D$ n   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
. Z) o7 I  s% {2 v8 `2 X       Set<Integer> set = new HashSet<>();9 {& {- S! Q: `* p2 H) A) R5 K) t
       set.add(nums[cur]);
5 `1 _2 r3 r( B% A& I       if (!children.containsKey(cur)) {8 u. ~5 u) H7 S; S4 F9 s3 k. x
           ans[cur] = nums[cur] == 1 ? 2 : 1;
  G7 x! }: X) A! A           return set;( X$ h& h/ k+ L; P, V! w$ @
      }
- N5 t: v- u/ a, H* m$ O- B: O8 ~" O6 v       var child = children.get(cur);
/ b, Y  m: D  F/ g/ R- }$ g       int start = 1;
1 }4 ^* f4 \2 Q       for (var c : child) {* x, u2 Q9 J$ h
           var r = dfs(c, children, nums, ans);
  l3 ?( t" G' P1 E$ @           if (r.size() > set.size()) {
/ P  }5 y( _# t               Set<Integer> tmp = r;
5 i9 o; f4 }: y9 [6 j% @/ F               r = set;
/ |1 r9 ?7 w+ s& M7 U4 }  y               set = tmp;4 c+ f6 y: E2 _
          }
. K# z2 ?! R+ l" X8 P           set.addAll(r);
" ?5 C( m6 o& w9 V' }, c           start = Math.max(start, ans[c]);
) {, O. U$ e  ]      }' a8 x$ m+ Z5 H" [" ]
       while (set.contains(start)) {( P3 E8 \7 v/ C) S, d
           start++;
0 T' h9 }  s* |4 {      }
3 O) m9 R$ f' P: z/ j       ans[cur] = start;0 N2 u7 X; A' f  D  V% D
       return set;
5 w7 S' X6 ]$ s) L  }
$ g7 u0 _0 ~" W$ X  l* _, e3 M}6 B" n& z; ]: A
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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