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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】9 ~3 Z$ B5 M5 Z( ?" e8 s) Y

- a: s+ K7 k2 y: ^" h( O6 d解题思路/ }1 R8 V+ A/ n8 |5 _3 n2 K9 W
签到题。
; F$ Q; k& `2 K  {" E3 q1 m
+ ~3 m# {. P$ Y/ j) A+ @, ]' S代码展示
5 O. H8 @5 S0 ]4 T' b- T
/ [' A1 N! W, A1 y; l" s9 Q6 y) E( `class Solution {! H$ ^$ V# }' i4 `, P( X# q" A
   public String reversePrefix(String word, char ch) {
; v# {" g8 g% o) G       int index = word.indexOf(ch);
* T  }" k2 i$ m% \" Y4 M       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +: e# b4 z. Q0 R; m# B
               word.substring(index + 1);8 D1 X8 d5 [% f% N) D$ g3 g
  }
( U& _" M/ l' D+ p0 ]}- z. t/ k( h/ Z  D
* b3 \3 D9 \% q3 R* Z/ d
: x+ F' V2 r( u/ Z

3 k2 A4 k2 q0 q" b& M2 W2 w
0 p+ I- ?* J; q; |8 {5 }【 NO.2 可互换矩形的组数】
& Y+ G' P4 z4 O! ~
) q; M# D  b0 |/ f6 f# K4 R1 X+ S解题思路
6 `3 U  `$ }* w$ p6 o, S0 D将矩形按照长宽比分类,计数即可。
& X8 @! L$ H" Y9 [
. y# D' N* c1 q* `3 N, |代码展示* k$ {) b, a$ L$ @0 N  [. D3 K
/ C7 m% b! F5 f8 `4 _
class Solution {
/ p+ V6 t! {5 O$ f  Z2 T* M7 p! u  W   static class Frac {
) ?) N( V2 m" S7 S4 Z4 f       int den;( }' S, b4 W7 {9 }" p; p
       int num;# g' A1 ~' y4 O; N

" r0 l4 Z) r2 _) l- n/ Y; B       public static int gcd(int a, int b) {
! M8 p# k7 r4 B- s$ Z           return b == 0 ? a : gcd(b, a % b);# J; ^' G% e( B2 U
      }- ^6 x6 ~6 I5 l8 Z

4 n* m  m! P7 P: q) K3 M       public Frac(int num, int den) {2 O6 v; v: y/ i' k5 V  x2 l) ^6 i
           int g = gcd(num, den);
+ I. L& D' J) T- G8 P           this.num = num / g;
  O; W. t3 ], E8 G           this.den = den / g;" o% o6 a5 ?& b4 s3 b8 u! j" T  ^
      }
4 k5 Z* t: i1 }9 l4 `# z; H: d! z$ o: Q+ ?3 q
       @Override: t+ X0 o7 J& t) o
       public boolean equals(Object o) {6 H* a9 |& ?( O. v& ?! Y; J( g
           if (this == o) return true;
/ h+ t, X8 E! q           if (o == null || getClass() != o.getClass()) return false;
  C  D8 ?1 Q* F2 e; s4 U/ M           Frac frac = (Frac) o;
2 s1 |* N+ y- O& ]6 W* {0 W           return den == frac.den && num == frac.num;5 n  k" l% R# |5 e; A: I
      }
9 M& B, [/ L8 B  h
% P1 A: ?; \# M; o# L3 q/ Y+ n/ w       @Override" n/ y/ W6 u/ ?' p
       public int hashCode() {# E5 V3 r1 k$ l; q' s: Q$ U" C0 m
           return Objects.hash(num, den);
+ c9 _3 @" e) X4 C" I      }. v( E4 t! {/ P: |9 E( P
  }! `0 a+ O; D" K4 ^' Y. X
* m8 P# _5 P: i1 y
   public long interchangeableRectangles(int[][] rectangles) {
5 P$ @/ I3 f# J5 k       Map<Frac, Integer> count = new HashMap<>();
2 ?* e4 I" i9 Z3 S$ p       for (var rec : rectangles) {+ [4 F* Z& X& A2 D( T) @$ t
           Frac f = new Frac(rec[0], rec[1]);4 Z* b( X( T, ~, l
           count.put(f, count.getOrDefault(f, 0) + 1);
+ c- f$ G) t; C' I1 W      }
3 \# `( [" Q. r9 `0 H5 z       long res = 0;9 k5 \9 o$ [6 s. C
       for (var k : count.entrySet()) {+ F( P6 ^! ?/ n) U. L4 _& h( s
           int v = k.getValue();
. Y$ M' i; B4 h* t! t/ K1 M           res += (long) v * (v - 1) / 2;
# m* Q& p' {2 P8 k- c4 R3 ~+ C      }
0 Z, `- x/ z! s" E6 N$ r       return res;9 n, I0 r- R! V$ y# T9 w
  }( K8 o; P, @" S; [% i1 U8 ~4 X
}) W4 r8 D0 f; p

! N; E- B" y5 Z* a, g9 R+ Y" v& C
* B! G4 B7 s7 E! g' ~( v【 NO.3 两个回文子序列长度的最大乘积】3 @" d+ M/ i( i

( B0 _; m* L0 C. H- @* ~2 [- p解题思路
1 V9 H" a6 ~1 _7 x( G) Y暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。, f% T  Y  ~" v, \' _% S
. N% G. X3 J1 G$ `. x$ l" y
代码展示
! A. D  j+ \" Q8 M
5 Y* V+ o, @3 _, j" d, |6 oclass Solution {* k1 u) y5 `7 K0 T2 W# T0 ~
   public int maxProduct(String s) {, {' T9 v0 R  a7 b
       int len = s.length();: G+ {4 t0 e7 j/ c5 [
       int res = 0;# k! g% K8 s( `6 I8 \1 ^
       int[] mem = new int[1 << len];5 c3 n' a/ ^6 M( |
       Arrays.fill(mem, -1);/ f* V- u2 B+ g$ q
       for (int i = 0; i < (1 << len); i++) {
- a) Q2 y& R- y           for (int j = 0; j < (1 << len); j++) {8 g7 \  w  s- H! p
               if ((i & j) > 0) {  Q: [/ j8 t/ }
                   continue;
. _9 z7 g5 M4 `) t! Z1 M              }& ]: V+ G+ y( W0 h
               res = Math.max(res, length(s, i, mem) * length(s, j, mem));
- w# _, V) i; Q% M          }
3 p, d) c' r/ K, a3 X7 D      }
# x, y4 z3 ^- |+ `3 P* [       return res;
" B& X. Z4 o- I1 w/ a, x  }$ u0 O* @9 _  |4 h

1 a' e( ?6 c2 p0 R0 R) S   private int length(String s, int bitset, int[] mem) {7 c+ L( E1 E: W9 }  M4 K
       if (mem[bitset] >= 0) {( A$ G6 M# d7 A) h( f' F  s
           return mem[bitset];5 n, i6 P7 a0 F! O2 P2 n+ a& R
      }
  d% t& j# {9 y% ~       mem[bitset] = 0;
! M4 N7 j$ g, n( L4 }8 p: m9 l       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
% ]* J8 u, l2 F0 x9 V' P7 [( Y' U           while (i <= j && (bitset & (1 << i)) == 0) i++;
7 o$ g# ~4 Q* T7 a8 t3 _6 c           while (i <= j && (bitset & (1 << j)) == 0) j--;- f/ l9 ^; z$ j9 u) N' N3 @0 C$ j
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
0 N0 `% E8 o( Z4 J0 r               break;
) A" p: }9 n$ d3 r; c          }  @2 o5 }  G: y: K
           if (s.charAt(i) == s.charAt(j)) {' @& y* G# m7 h% v" C
               mem[bitset] += i == j ? 1 : 2;
) f* Z- u+ {1 |5 r5 X          } else {3 a6 o) n8 Z9 V2 b  a
               mem[bitset] = 0;
/ N: w, ^, o: Z               break;
: y- {, p+ D  z" [# N: g          }
; b4 v7 X/ k3 c; Z$ G! w      }
. W0 F$ C! P3 J4 ?) ~       return mem[bitset];
8 p8 O* i1 _$ X; V6 g  }
/ ]7 S1 A; T! C( d6 H}
2 _" B; i% b. q1 M& v8 Q
1 u$ R7 S1 S6 p! W( [% p( Q) d
" Y+ K9 ]2 v- G【 NO.4 每棵子树内缺失的最小基因值】; g" |) o1 }3 ]1 `
) i1 p6 ]+ c: R, t% j$ f. \) m6 ?
解题思路
8 C7 q4 P- M/ a$ SDFS 合并 Set 即可。但是有两个优化很重要:
2 P! ~, d; _8 R
* \4 V; |; x  e+ e, _, M1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 16 G7 o) h4 ?7 [+ d9 o

4 `) ~1 s1 h- V- t2. 合并 Set 时由小 Set 合并到大 Set 中
" y  m9 Q2 {2 g! {& d! b1 Z" r  N  k' ?3 Q

! F5 X% c2 R! z) x9 x! S代码展示" r5 u" ^; s( @; W" f/ `( s

8 c6 b1 H/ B* A' ~8 S6 rclass Solution {7 f% {2 i( `& Y$ B
   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# A) k  W4 s! O1 ]: ]& F
       Map<Integer, List<Integer>> children = new HashMap<>();
9 m3 @4 i  o& Z8 b* n       for (int i = 1; i < parents.length; i++) {
+ t* I1 H$ p4 s           if (!children.containsKey(parents[i])) {/ F  E. ?5 f1 U4 R) ?% x5 e" T# L
               children.put(parents[i], new ArrayList<>());% }( ^% k' ]& k; K! C
          }
) k2 h+ m: m1 e3 o/ k, H           children.get(parents[i]).add(i);5 Q1 r, b6 Y- n: b
      }
7 \- w; Z. K- P1 x) w       int[] ans = new int[parents.length];  g! J1 N# \$ }# W
       dfs(0, children, nums, ans);
' O7 ~( C" o4 y& O1 F7 I2 K       return ans;: @1 p' h* E" p+ `) n; K0 k8 X
  }3 y, e/ L) o5 p: _) X) d* x0 o

# J5 i, t' h/ M; E# I1 G* V% |" H   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {, r2 J7 e3 _# d3 F. c7 W4 B8 j. u* t
       Set<Integer> set = new HashSet<>();
$ p, u  x- [% v       set.add(nums[cur]);
0 U# ?, }% E9 K6 h$ z+ v$ o       if (!children.containsKey(cur)) {
6 h& q% |; Z# A           ans[cur] = nums[cur] == 1 ? 2 : 1;, k" ?8 I( q  ?" M0 a
           return set;
. z8 W" e- n1 a2 I- w6 k, |      }
' k) n9 Q4 h  W4 {       var child = children.get(cur);  a  l" v; k9 B5 N& I3 O6 q  S
       int start = 1;
4 u4 r# t+ Q# A& G/ Z, ~4 l       for (var c : child) {. s+ o% K3 U8 w3 `
           var r = dfs(c, children, nums, ans);5 Y4 I2 D+ N' g% e- R, t: v
           if (r.size() > set.size()) {3 x2 u5 X8 k# f2 O! Y
               Set<Integer> tmp = r;. H- C4 f7 \0 @7 w7 x
               r = set;6 U+ l, y, V+ o0 |* d2 B! L
               set = tmp;* g& m5 [* ?2 N9 O# y3 d
          }
/ q; Q$ W7 s, Y, V/ ]+ |9 b7 k, w           set.addAll(r);2 D# u' ?! G3 Q
           start = Math.max(start, ans[c]);
8 Z* D) h3 F0 z& C, H      }+ y2 {. j; f, U; M2 R
       while (set.contains(start)) {
" ~4 o8 c; P9 C4 p! M- Q7 o; ]4 J           start++;$ U2 ?. w6 `0 v, G5 _
      }) j9 V6 f. U. a
       ans[cur] = start;
2 R8 D8 G$ n. Y0 R0 q0 y# ~+ d       return set;# e1 d$ K' u7 U1 p8 n5 C& D* V
  }3 h! ?2 i3 [) w3 a
}' e1 v  R0 p7 E1 K  y3 z: x
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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