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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】5 l( I3 W2 d  _7 }

& N4 Q6 ]: y$ v$ q解题思路% f! E) E' P! E3 J9 ]/ i6 G* C
签到题。7 J2 b, M' l3 E& S' d' U
7 p* `/ L/ `0 A. q
代码展示" `6 Z' R' |% C$ p/ }! o; B$ v
9 Y/ I0 Z7 }. R) D; r  f
class Solution {( _) _# P; a* j) b( Y
   public String reversePrefix(String word, char ch) {4 C6 ~; v: [( b1 R
       int index = word.indexOf(ch);
+ H# A( f6 B0 b+ A       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +0 j( G) B- k3 }
               word.substring(index + 1);
  L2 @5 P4 h2 C, d: W  }0 ~# o+ Q* q; Q1 E8 j
}: \$ W: C6 w2 z* t8 S

) }: w& J0 |0 V# p3 J; G
  s7 @7 b, c% Q' G& ?7 O5 m7 Y5 W" O5 ~" l
& k9 e* b# R8 {: n
【 NO.2 可互换矩形的组数】
# a; K9 e7 P, a& W& a
7 S+ `2 Y" w# m解题思路
- J* G3 i- _, c0 b) j9 b将矩形按照长宽比分类,计数即可。
# n  G: @  y: K. r  G5 ]: P1 _1 k
代码展示
5 R  G7 g5 E" R
3 q. h( A8 a( H1 Q5 w/ h" Qclass Solution {
; O8 a$ I% Z- e5 I% t   static class Frac {9 i, B' H' W$ Z
       int den;
0 c7 j& M8 N5 k       int num;
! L  x$ W* `  D5 F' B" @2 j3 m
" r8 ~7 N5 {+ P$ ?3 c- {       public static int gcd(int a, int b) {+ X$ n0 J% b" v& v+ M$ W' K
           return b == 0 ? a : gcd(b, a % b);
! q9 I, o5 }0 M' r7 c      }' K3 J( j  {5 U, V7 L9 @9 _- t

2 F% G. Q4 ~3 H# V7 Q0 U8 ?% ]       public Frac(int num, int den) {* C* U  J. m) w- o
           int g = gcd(num, den);
: B/ x' i  X/ ^           this.num = num / g;
' R* i# |6 H' v- o6 b           this.den = den / g;* R; m) o, k8 D) J# y
      }( ~- _) K9 _! t2 x( ~! Z
- z( x) k9 J5 [# ]9 z) U
       @Override2 G. L/ U) v9 N7 R
       public boolean equals(Object o) {
. l" N7 N& U' q, x! s8 G/ L" W           if (this == o) return true;) N1 _8 Y/ Y, B' g+ k  ]" x( O- p( }
           if (o == null || getClass() != o.getClass()) return false;" R4 N7 [* U3 Z6 U
           Frac frac = (Frac) o;
: T9 K1 n# _  |0 J  d           return den == frac.den && num == frac.num;0 ]# ?! r' l/ f+ o- c  r
      }+ C4 ]/ ^/ v; G# w- r

' e& E5 z6 e$ Y) M( T       @Override
$ Y" B- M7 M0 I6 q4 k+ n       public int hashCode() {
0 l/ I" y' z' H; g           return Objects.hash(num, den);8 u2 p8 u$ f8 O8 j4 a
      }8 l, a' H, ]/ a7 D" x0 ~6 q1 m. W
  }
$ e3 s% l* q2 R. d0 `' b
4 s, Z2 ]' s1 @$ \: }" g+ ]   public long interchangeableRectangles(int[][] rectangles) {
( P4 k  ]( Q8 N       Map<Frac, Integer> count = new HashMap<>();9 l% H$ T( A! J/ Z7 u9 u; e
       for (var rec : rectangles) {3 n0 l2 C# ^' g) S9 @
           Frac f = new Frac(rec[0], rec[1]);9 ^2 ?% S, [+ t
           count.put(f, count.getOrDefault(f, 0) + 1);
/ n* I3 E7 n3 K8 ?8 f5 }( B* s      }: N) c& z) p8 Q4 O
       long res = 0;+ i; x/ U1 T- [0 c( z! p
       for (var k : count.entrySet()) {) g' b7 B# l7 {: i3 X, ~
           int v = k.getValue();6 v* Y* A! C+ U- m0 u! q
           res += (long) v * (v - 1) / 2;
/ x2 \: Q1 |! @- `* @8 m# z      }9 h/ u3 U" u% t5 ?) @
       return res;9 U8 }/ d5 ^  n8 t/ Q/ f
  }" ~7 W4 E4 z8 W/ Y. Z
}
( }4 H! ^& O  T& Y; j4 p5 K6 n# d* }9 M" y

% s, b% n( [7 C$ K【 NO.3 两个回文子序列长度的最大乘积】! e: W9 s* ^0 N9 y) g6 L2 n  u
4 N  M, E- E% z5 d6 c0 q
解题思路. [- o7 O6 Y3 O" i) j
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
" ]2 u: o* I/ s! u9 Y/ ]+ D' j) n# g* `* D
代码展示# t8 \/ l! o. \7 l  `8 v: `9 f

* O1 ]  Z9 z4 E5 }& M6 vclass Solution {( j1 [0 h: C6 @! J
   public int maxProduct(String s) {  a* o  q) w8 ]( j2 X. d- Z2 e0 l8 O' I
       int len = s.length();
) A2 W# e$ E0 y( Y& K       int res = 0;. Q% t6 T* s/ S- T% Z
       int[] mem = new int[1 << len];$ X6 c# a& Y: P1 v
       Arrays.fill(mem, -1);! h9 J) ~3 T0 y! \8 Q7 e7 M
       for (int i = 0; i < (1 << len); i++) {
1 ]! S7 a4 l) j) n* ]- l           for (int j = 0; j < (1 << len); j++) {# X0 p% t8 T: r4 j. y1 Y3 F
               if ((i & j) > 0) {7 l4 {3 s. [! T( D0 }
                   continue;5 ^# [. J  O: J1 Z( F
              }! d; s/ F0 P! I
               res = Math.max(res, length(s, i, mem) * length(s, j, mem));
$ h3 h3 d& B- M* g: C# s, h0 F. m          }* o9 Z7 [7 |& K& L, S. M- z( O
      }
# b2 k. V' `* d1 [# ?. k       return res;2 d9 P* ?) S3 n* O
  }3 `# v" h# f% H* G" r+ f
- T) n# ]% j7 ?8 b) O+ ^0 t
   private int length(String s, int bitset, int[] mem) {
0 c$ W7 o9 V+ N3 H# c       if (mem[bitset] >= 0) {0 A. t3 R/ C& a9 H$ [$ r1 f
           return mem[bitset];2 C; l4 `3 M0 H: i3 S: V+ H
      }
0 T' t2 j7 h5 g6 C) P# _       mem[bitset] = 0;
# R2 D. b- g' T0 o5 _       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
9 P4 F0 e: z4 F9 ^           while (i <= j && (bitset & (1 << i)) == 0) i++;, I- u" t; r7 G  V4 _/ R
           while (i <= j && (bitset & (1 << j)) == 0) j--;
0 q- M( x4 k+ z) r           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
: k. O/ r- J. r% D; W' ^4 ?               break;  K2 A8 N$ D! J  c
          }
: t. e* `6 ?/ w0 s           if (s.charAt(i) == s.charAt(j)) {- \2 w- f; d/ s' ~& N- r
               mem[bitset] += i == j ? 1 : 2;
% \. x  y% y) v+ n2 h% Y% T& P% l          } else {
+ w4 D( n1 K4 N5 P1 [. z: c               mem[bitset] = 0;3 v5 }$ L3 L- S
               break;
  S# W1 T- ?" z- W- \7 @) [, M          }
: q$ c. V9 ~) v3 }$ b      }& K. u' }- M9 J, j0 K
       return mem[bitset];
5 |- c$ X7 {( H; t* m' U  }6 f" q' J. @' t# p2 A: x0 x" i( m
}/ k, H' j/ C' V. E8 D0 r
# t. x& b. `9 q5 z! {; ~, ^) ~

& r  C0 ^8 l  P) D! ]【 NO.4 每棵子树内缺失的最小基因值】
' }" `! A( q1 x# @
, w& I' O$ F0 K- d3 E8 `) S解题思路
* B+ d. H, J8 ?' EDFS 合并 Set 即可。但是有两个优化很重要:6 N( k9 S0 P$ X9 V/ F: }

0 `# ~4 ~+ h' x5 X- g; t1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
# `* l5 T2 m/ w8 i5 k% R8 u2 L8 t4 G- M+ R6 ^5 ]
2. 合并 Set 时由小 Set 合并到大 Set 中
; K2 l+ Z, N% j+ y- G: v* B* t1 O( p! P) j
+ d7 ?1 O. E$ W8 I3 l
代码展示, L9 D) Z, o8 U, m" S
8 Y5 j( `& Z1 d
class Solution {
9 X" \  K* c- N7 H0 y   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# J: L7 K8 b0 e8 X* f
       Map<Integer, List<Integer>> children = new HashMap<>();% P, x+ L: m1 s+ c7 b
       for (int i = 1; i < parents.length; i++) {# b$ H$ t, `. W4 L7 n- z" d( S
           if (!children.containsKey(parents[i])) {( N4 i2 f( \# O4 {* N1 i! P
               children.put(parents[i], new ArrayList<>());6 _& E5 H" u& G0 f1 B1 G- q' O
          }$ Y2 l& f4 E0 s: d3 h1 n& [. x
           children.get(parents[i]).add(i);
7 u) @* J: F/ B; G# k9 l      }8 m# w: Y% @$ v/ k7 X3 a+ X
       int[] ans = new int[parents.length];- R5 _3 S  X1 L2 u
       dfs(0, children, nums, ans);
: G: L2 P' t  |: }  |( P) R" z       return ans;
; R8 S2 O0 c  X8 o4 ]3 {  }
  o# L' V& Z/ T; A; f. }# N4 y: @4 a
   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
- n; F8 T% ]  J* `" B; L  P       Set<Integer> set = new HashSet<>();
6 F7 m% G# l) K       set.add(nums[cur]);' o7 r3 j9 _" U' \# J. B( ?6 k
       if (!children.containsKey(cur)) {* {6 R# Q6 Z0 l, @7 q
           ans[cur] = nums[cur] == 1 ? 2 : 1;$ ^& L+ e$ X5 h! d# d
           return set;2 G% W* D4 Y# g" o/ j: m
      }0 N6 W/ e, [4 W  q2 M
       var child = children.get(cur);
; g1 l* Y! [& Y% Y% }       int start = 1;
# R1 Y  S' L0 U! p5 T/ t' L! J       for (var c : child) {
4 q( j. Z7 x7 S& C           var r = dfs(c, children, nums, ans);
' f, j. u+ Y5 j1 g           if (r.size() > set.size()) {
6 a/ t- G8 b" x" {               Set<Integer> tmp = r;
% N  L$ `8 i& z) R7 G; ~               r = set;2 Q; {. _- |& u
               set = tmp;; ~9 |6 L; D* w: v& L6 `3 N
          }1 Z$ r# ?2 c. N! l9 t
           set.addAll(r);, c' }! f$ ~) P* C# n( j
           start = Math.max(start, ans[c]);
9 _# t+ @) w( P6 Q# `/ v      }
, Q& w* A; o$ X3 F+ l       while (set.contains(start)) {
/ `, d: u/ L# g0 A% a5 J& b4 Q           start++;! h: U" N, {) e$ f7 s
      }7 _1 _; @) X2 u! E; H
       ans[cur] = start;: ^- x8 b4 P. h+ e5 c: Y. ~3 j
       return set;
3 U2 d: Z( d1 ]+ V0 w9 y  }
( ?& `; w/ V: K( @* \6 T}# k% L9 G+ l* M3 |% n
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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