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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】
* L* q- Z" O  S3 H- v' F; ]. s( K; N( v1 r6 |8 @2 M
解题思路: t+ @3 U" q6 ^8 |. C5 T
签到题。. p, `2 g- A9 ^0 E4 `6 \! G" c9 Q2 o
5 F! M% w1 _6 w. v
代码展示
) _8 x0 [* o& A: w1 t' D# }+ {1 O! u; M; K4 H" f
class Solution {8 w; D) Q9 H- {5 S9 Q5 y7 B7 T
   public String reversePrefix(String word, char ch) {
/ R  ]$ T3 _6 k4 N. y5 T       int index = word.indexOf(ch);
% `; Z8 t; U. b! O% r1 ~       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
/ W( q9 [- {) W+ H0 Q7 q               word.substring(index + 1);) u+ [7 o( J" `! X( }
  }) F6 X' N# m) T" ?
}7 U* C; Q4 S& G- l
5 _5 a6 h% U5 {- D+ v( n# d

2 f& R+ ?! c+ ^7 e
/ e( m, u/ K) h! @2 M  E9 h# U# Z4 P/ y! s& Z* ~" L
【 NO.2 可互换矩形的组数】
* V; I( v+ m% X0 p( E, y3 g- n% g' Z, P- Q9 C7 P
解题思路
) S/ r" G' m: N6 U5 {) \将矩形按照长宽比分类,计数即可。
/ d/ a0 B  U. F0 P) D: G' [" K( ~3 K) V' s% R$ a# [1 d, v: A3 S
代码展示
7 b% m5 }. W' R: K9 N( O: @4 ~- g( ?# W) g  W3 m  ?
class Solution {2 R; q8 B* x; u: X2 z
   static class Frac {# _* p5 l7 h% _5 o
       int den;+ @# J8 Q2 p4 U, A' ~. s6 }$ f
       int num;
1 U4 G& R  @  Z& Q4 K* M: J3 t8 M6 q
       public static int gcd(int a, int b) {
& v; v. g  J% Q) {" P3 [/ X           return b == 0 ? a : gcd(b, a % b);' ?& _- m9 C+ @- r; [
      }
* Y. ^- f1 ^5 X$ d6 W) i( h; k. E" h6 M% u( C- n
       public Frac(int num, int den) {
+ n9 V$ S* R3 F$ V9 k* _7 Z' s* U# y5 I           int g = gcd(num, den);/ }+ f8 D8 i7 S
           this.num = num / g;6 k2 A$ ]5 L1 `- a; Q/ R2 `
           this.den = den / g;
- V; @3 |: U6 L8 ?; o      }1 Y3 `+ p0 Q; n, O! s$ E
: ?# I& d, f, F3 F; g6 ^6 g* z: U
       @Override* Y: M6 c6 [+ V4 T  H! r' }
       public boolean equals(Object o) {% o, m# w, ?. S5 p4 ?0 r3 q
           if (this == o) return true;
# L1 g- f3 W) }% e/ u           if (o == null || getClass() != o.getClass()) return false;, o; h5 w7 R! V+ _8 \. L% M8 T' E$ M
           Frac frac = (Frac) o;
( a. O. v3 c; c$ i/ Z           return den == frac.den && num == frac.num;
' S; `/ x* ~. q$ H      }4 M8 F1 m2 f/ \4 }( ], q

9 T, U2 V4 }$ w2 R& K       @Override
$ M9 F2 K! _, u1 Y% ~2 N       public int hashCode() {
/ M* G, V* D3 ~' {5 `; g0 `4 X           return Objects.hash(num, den);* f! ~) w% Q% z8 B7 ~4 |
      }
; J0 n1 o/ j$ W4 s. U/ i3 @  }
, i- [3 `5 v  `* l
' y3 U" i& ]+ p/ }" p' d0 v   public long interchangeableRectangles(int[][] rectangles) {
/ f: r$ ~- R( F& `4 }  ]       Map<Frac, Integer> count = new HashMap<>();
4 y7 b2 o4 x$ q: J4 B) _+ b5 M: {- N       for (var rec : rectangles) {: T( n/ ^: p9 O5 J, A5 u# a5 G
           Frac f = new Frac(rec[0], rec[1]);
. l+ k/ ?! f( s' I# p% N- V           count.put(f, count.getOrDefault(f, 0) + 1);: v" E3 E) m- J5 P. H
      }
. v) E- i! ~# B; Q: x# \6 y* T/ r       long res = 0;
2 [  X' C3 A# @5 g3 u3 }( F       for (var k : count.entrySet()) {
4 I6 u0 ^, h. X* G" S4 W! L9 A           int v = k.getValue();
% W# q6 n+ V  K; x+ u# v           res += (long) v * (v - 1) / 2;  r3 N; L) z/ ^2 Z9 ^0 G3 j0 G
      }
. G. ^. M; L2 }# y2 q       return res;& w( \) l4 E# N: q/ v
  }! K, ?) |$ j2 |0 j; q
}
2 B, f7 C, t; u7 U
# ?' d+ w7 I1 Q# M# x, J1 a( g# j; U# s
【 NO.3 两个回文子序列长度的最大乘积】
: C  M% Q8 ~; ~# W; Z5 h+ u8 h3 O9 {; \+ ~1 }/ a4 R
解题思路
6 C6 N  O# Q6 w* C4 @5 s( s; j+ W1 N暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
  F, \3 ^5 V7 D2 a' K( y
  Y7 P: |7 I& e代码展示$ Y( ]4 G" P( I6 `, z
# ^# N2 N$ q6 ~$ w1 ?. @7 C
class Solution {
  p3 ?/ z7 L0 J2 F* s9 U   public int maxProduct(String s) {1 O7 q5 h6 o  p2 l' P: g# y
       int len = s.length();2 {  S9 S& |9 l5 t, q! a0 ^* S
       int res = 0;
/ _' L1 z5 D4 K0 {" T9 d       int[] mem = new int[1 << len];% ^7 I+ g+ d' K3 ]/ e- E
       Arrays.fill(mem, -1);( ]( c( L/ o0 y# e: b2 X
       for (int i = 0; i < (1 << len); i++) {8 }, u1 d2 d. C. a2 g' w2 F
           for (int j = 0; j < (1 << len); j++) {
2 }6 p4 h8 [6 F               if ((i & j) > 0) {& \0 g% X0 _3 @. L0 y8 W
                   continue;9 M$ d; x6 j! U. j2 X
              }
( s9 |, y6 C6 j; |' x4 ]. L               res = Math.max(res, length(s, i, mem) * length(s, j, mem));0 B3 f& v! x# ^4 n" d2 T
          }
3 h; d6 f9 W; P9 R* ?2 M      }
0 U: K5 b5 W: @( U4 H* z2 h" T       return res;
& @- q6 N0 j) {) W& m- j  }( t4 p* G8 r; v$ k+ o% x& [* h
  W2 i! E- w. j5 B
   private int length(String s, int bitset, int[] mem) {' o0 f1 X" X( I5 B0 i' T9 Z/ j
       if (mem[bitset] >= 0) {
3 T  z& j+ Z, K% K0 r3 Y1 ?           return mem[bitset];
# ^- j& n) {3 f$ H! `2 D      }* l, I; C. E2 ^( B' E
       mem[bitset] = 0;
! Z: D+ v$ [, _$ ^, d, I) [0 V       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
3 G5 k2 P; V" s& F* l- _9 u           while (i <= j && (bitset & (1 << i)) == 0) i++;
2 S- J% V. k0 b. A7 W8 f+ g  n- @% P8 r& ?           while (i <= j && (bitset & (1 << j)) == 0) j--;1 ?7 w& P9 ?/ n3 X
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
/ W: V; H6 F) I" H( }               break;
3 Z9 W0 {$ @( O3 s+ W9 ^; I          }2 U) {) f& n. T9 G! m9 I
           if (s.charAt(i) == s.charAt(j)) {
& U2 G  r( t$ J; W               mem[bitset] += i == j ? 1 : 2;0 B, V/ g* j3 A3 H
          } else {
3 K8 U, H  B; H: c1 H! W6 K               mem[bitset] = 0;
1 e2 o) a  l) @               break;
! O9 P% t1 p/ w5 V  S  A& \          }
1 _: S  l7 ?  D* a8 n      }
+ k' W0 J/ x% y- V% U. J       return mem[bitset];
* ^9 H+ ], J: R" U% K* A  }
0 j! V- z7 t! k* P" b}
) Q) j4 F2 T# G* f+ c/ V7 g% o
; g* ?' d5 r! h) n0 {3 N) l3 x$ v  F1 I* D5 i- C4 @
【 NO.4 每棵子树内缺失的最小基因值】. I" X+ m+ Y) L3 p4 B

: o3 n- X: N9 O3 V- s解题思路& ?* Y/ W8 [4 R
DFS 合并 Set 即可。但是有两个优化很重要:
* c5 M. ?$ X' u! {
& y4 {* }1 y6 ~: B' i! f4 h! X1 ~1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1/ i; e0 x, c3 L9 t/ e) o& \5 L

2 d9 B% r8 ~7 M0 b& {9 ?% f& o2. 合并 Set 时由小 Set 合并到大 Set 中
3 h/ X" u) ~; l8 n( Z
! E& s7 p( H& Y! f0 _5 f- ?2 W& J. F  y+ G4 y. W- w7 x
代码展示
$ V" v; B* N5 F! B2 [% Q2 x# C/ b6 {. L. n" U
class Solution {
- U9 m& z+ O( x9 h8 z   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# ?$ g  `+ P) ^& A
       Map<Integer, List<Integer>> children = new HashMap<>();
7 |/ N4 c- N3 c7 c6 b/ A       for (int i = 1; i < parents.length; i++) {
. a' i) R+ C3 [7 q           if (!children.containsKey(parents[i])) {
! Q. E1 Q1 a$ [               children.put(parents[i], new ArrayList<>());& h' m- N* B, R* ]2 b. i2 ?2 q
          }( r) W; a* E) i* M+ B/ ?- q
           children.get(parents[i]).add(i);0 ?5 S3 O6 {5 b& H2 A% R
      }# S, h  n- Y( W. K. c- M/ W
       int[] ans = new int[parents.length];
5 D* o( O$ s5 v/ \$ ^/ n/ f       dfs(0, children, nums, ans);& _" w, w& F7 K! u  M1 t: {5 t; D! G
       return ans;  ~7 k+ \0 w; q1 O; P- `/ B
  }6 I. f: h; I7 G

3 ^0 q8 t- a2 T' S3 S7 i- m# o   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {" u- V0 W* G. T5 `/ M8 O
       Set<Integer> set = new HashSet<>();
3 W" l0 w4 W% i: \       set.add(nums[cur]);
4 ~# [% k* o7 S1 z* N3 s$ N. a       if (!children.containsKey(cur)) {9 K$ ^$ {) g. E5 g/ c
           ans[cur] = nums[cur] == 1 ? 2 : 1;& b. P% V' p' A! o& Y
           return set;7 _6 D3 {  F8 K+ m* z% m
      }0 t% D2 f1 E+ p- U- r8 w. R0 [
       var child = children.get(cur);
" Z) M) w/ G; j0 N3 g# U7 l       int start = 1;
( N. [) F# z5 X2 D. @       for (var c : child) {5 ^8 ?- R# z5 B$ C1 Z2 G% y
           var r = dfs(c, children, nums, ans);
1 l: Z) ?" o7 ]1 ?; @8 A- g8 Y           if (r.size() > set.size()) {
$ F7 n! ?5 W1 e  q. H               Set<Integer> tmp = r;, A% ^- n, w2 u5 P9 I
               r = set;. ]- I" e* i& Q( w
               set = tmp;% e9 I: i3 Q4 E  n  K8 c
          }
5 X0 S) {6 Z2 P( V% o           set.addAll(r);- p2 D2 M! F4 N5 T3 H8 v9 ?4 j( b5 h
           start = Math.max(start, ans[c]);2 z) u; V; ]1 H% ]" f2 a3 G
      }6 Q! _  }5 v& l
       while (set.contains(start)) {
. B- r  L( T; V6 S, \, |1 Q  e* i           start++;/ V" _: ?! I0 u- W) ~
      }
; P+ G: h. v$ A! x' ^4 S1 }       ans[cur] = start;
) N5 [4 p* Q8 Z: j2 r% T       return set;
8 U. z1 b7 D9 y/ S0 e4 N. _  }+ }% X& c* s6 t8 m0 d2 _
}
/ m; u! u8 U. A' }: @9 r# u
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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