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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】1 C# l* b& R0 b# Y  s& s

8 S' G8 w) v. y9 J0 \% L( @解题思路
4 m+ f9 H$ J% u签到题。5 T3 G3 n9 B& F1 @

% v! Q* ?) }1 K8 S! z代码展示$ X) F' B1 k6 o/ k4 a) Y
) e6 p; e) H; Q
class Solution {
: o6 g1 {) ]& \/ e7 V. L( ]- a6 L   public String reversePrefix(String word, char ch) {
/ P  f* ?% h0 ]3 J# h: j       int index = word.indexOf(ch);
+ S( X6 j) I4 @% ^" O5 ^0 r' _       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +  r( I; E( u3 j5 R0 ]
               word.substring(index + 1);
1 a5 A9 W- Q* p* D% _7 K* q) ?% J  }  F2 p5 B5 t+ O7 U( i
}
6 V: M1 }8 P6 l( s
% ~3 a0 B+ c) d! h! |3 f* i5 ~' D3 P8 s9 A

) |- _9 X4 t% \& j2 W% U" P6 z' |+ y( Y7 \% l3 h( A
【 NO.2 可互换矩形的组数】$ C/ f! k. d4 H1 I$ x$ g7 V& A
& g+ }% i4 G$ h+ v5 E
解题思路
' ~5 f& w4 P5 M0 h; `/ }. U1 ^: Q$ F将矩形按照长宽比分类,计数即可。. ^. x8 F2 g" _8 X, e7 u  c
% y, I3 O  b0 W& `: Q
代码展示
% v5 m6 b, D# d7 g0 _6 `2 M( P: v( J4 b
class Solution {
8 P# @) Y( e5 H5 ^   static class Frac {% H5 g+ \2 L! @9 P' R# k$ D. T
       int den;: u" a/ s! Z5 ~0 S
       int num;/ C1 F- C7 Q/ P! b# a2 A
3 H: y1 ]. v0 I
       public static int gcd(int a, int b) {* F9 S/ W* |9 N1 I7 r* A0 H7 {) h
           return b == 0 ? a : gcd(b, a % b);
, U7 B5 |2 n4 S- c% D      }; S- I2 v+ ?# x/ k
# H; ]. z& w$ Q$ D1 a
       public Frac(int num, int den) {" V2 \: ^0 R- D
           int g = gcd(num, den);
9 O" B' X4 R: e& J, @2 O. h+ V5 `           this.num = num / g;/ f# }! [# V% V# o6 A: t6 i
           this.den = den / g;
5 k- N) @" k' B0 ^+ F      }
6 {3 a$ h/ w$ r4 N. X
2 Y9 G2 U" p! x       @Override
5 K7 h% g( j& F$ w       public boolean equals(Object o) {
/ p  ], e% x* i           if (this == o) return true;
! [/ A. W$ M0 D( G% \           if (o == null || getClass() != o.getClass()) return false;
: G: x& q) f4 Q$ `8 r           Frac frac = (Frac) o;
1 l. n: F4 B7 b: e           return den == frac.den && num == frac.num;% N# [8 q; P- f7 D
      }
0 Q  \6 {1 h( T1 c* D; k- Z0 t7 |! T1 D3 d1 W6 W( t% |( [6 K9 A' ^
       @Override, G1 j( M' t* R+ w: }+ S# ]
       public int hashCode() {
8 ^4 c  l) ~$ E# T2 ?           return Objects.hash(num, den);, V" i' J( b# x5 N* p7 x
      }
. a9 k1 t6 Z$ A* r* C' o3 p  }
+ ~/ b2 c# a1 D( q- }) w/ Z% n1 _
. q5 ~9 ^5 i: ^2 y, z) I, E   public long interchangeableRectangles(int[][] rectangles) {: O( Y" }& V8 l3 E# M0 X
       Map<Frac, Integer> count = new HashMap<>();
: h+ [/ q1 U. o) ~       for (var rec : rectangles) {3 J+ y# _. c2 G
           Frac f = new Frac(rec[0], rec[1]);$ L0 w; p& O5 A* W' Q% c
           count.put(f, count.getOrDefault(f, 0) + 1);
+ R0 U  R3 e- V      }
& ^9 |. R. q# y4 r. o4 W& T       long res = 0;
1 n2 r4 ^" R3 g; {1 H, h$ E* ?3 ~; G       for (var k : count.entrySet()) {
$ B) g% l" U0 T! S1 V) B  X1 X           int v = k.getValue();8 `2 H* ~" i& ]
           res += (long) v * (v - 1) / 2;6 ~7 |0 z" r# b, w( d) k# Q- x
      }% ^+ g5 n) T1 d) ?5 b
       return res;& }' H" w# _7 @) G
  }: E: ]9 J  W$ h2 w
}! ^- h, ?# K! [/ q

1 c# s4 L& E+ h: L/ Z
) I# s9 a# J8 D【 NO.3 两个回文子序列长度的最大乘积】# k% g' }0 O8 S" {: \+ ~, `

$ n  W" k) m3 m6 D* S2 i% ^$ R2 ?0 }解题思路8 h6 j# L+ f5 A8 L% c
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。! S) @8 b$ p* r+ {# M8 z( Y

% S& N; o9 o* p. E1 k( S" D代码展示4 C+ v: {6 n1 L: M
% j( n: I6 I2 o* ?5 c- X
class Solution {) R$ Y$ J/ K+ o( E) c4 ]
   public int maxProduct(String s) {0 n* Y1 m" n; g: Y9 U. J
       int len = s.length();& i% M9 b6 A& E4 c0 Y5 X  O* H
       int res = 0;6 M9 E  f+ d* ~2 Z: J$ e$ q
       int[] mem = new int[1 << len];
( C0 ~7 Y1 Q" E  G9 C  p2 X       Arrays.fill(mem, -1);; }& d0 X6 ]! k7 \4 s
       for (int i = 0; i < (1 << len); i++) {0 k5 ^  Q. B& F1 {
           for (int j = 0; j < (1 << len); j++) {: E+ b3 U8 L9 s" X; v2 p+ C; C
               if ((i & j) > 0) {2 Q: |4 _* q! w# P2 s4 f  N
                   continue;
: F: t4 {# q/ ^9 @+ u( d              }/ C2 r2 E" N! f+ b
               res = Math.max(res, length(s, i, mem) * length(s, j, mem));% h! o- P/ g3 f9 h  P# D5 i
          }% N9 R1 s. m. Y* n* S- K  ~' y" a5 r
      }
1 N! T6 `( `) C* l! x3 T       return res;
6 h  }& w6 R, U# F7 g( M$ R  }
  [4 N1 v3 K. [1 |& D, x' U5 C( w* ~. T2 y: Y" ~9 r6 l* N
   private int length(String s, int bitset, int[] mem) {
9 i6 z$ r, R5 b7 h' H. @$ {       if (mem[bitset] >= 0) {
$ ]8 Y, u9 q) @5 ~6 K           return mem[bitset];. w, @: L- G0 c: }  _. e
      }
7 F/ ]+ m/ o8 _( }       mem[bitset] = 0;
4 o4 C* d8 ?- c0 c; F       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
' n/ [) ~& ]/ V( c" X: g6 T           while (i <= j && (bitset & (1 << i)) == 0) i++;
0 v3 t% [" _! \, D9 t/ ^3 {           while (i <= j && (bitset & (1 << j)) == 0) j--;! }0 l0 o8 t3 k5 A6 X0 o5 Y& f
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {" R* z" v; Z9 r( K/ f8 @
               break;
/ V2 ]( L- q( Z7 }/ S- s          }
* \; B; w: m2 i/ d           if (s.charAt(i) == s.charAt(j)) {
  Z% D# G% r' p) g               mem[bitset] += i == j ? 1 : 2;! J# m8 ]) S7 L7 K$ f* t$ Q
          } else {! V2 f* a3 l  r
               mem[bitset] = 0;  A5 O) B( T( L2 Y( R6 E/ N
               break;$ S% H! U1 W; I: H2 J
          }" Q! J( t6 K' M* B
      }7 d% X* d& l) W, b* k
       return mem[bitset];  l0 }! K+ C: \" [$ `* o, H1 p( j
  }5 [) F/ P' Z( I9 f$ a. c4 o
}
# b. U3 b0 p7 P( f7 H" @. ]( J& X0 H' r) ^  i8 v
, M, h+ l; |; M# ?! i' L" \6 F
【 NO.4 每棵子树内缺失的最小基因值】
4 w1 `  Y0 t2 K+ \! p
  O) y2 I! P9 |4 U% C) ]解题思路9 X- g/ P5 e! O, _) ^4 J
DFS 合并 Set 即可。但是有两个优化很重要:* q4 V" r& u7 m$ X. k

4 ^% I# _' c; X4 ^/ u1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 18 f, q* A- N7 Q  O# I

3 z% G* }* J9 ~9 u' h2. 合并 Set 时由小 Set 合并到大 Set 中. N  T8 {( m6 T' y/ @! l- a9 s& _

7 a0 u4 Q$ C' E1 J9 O, u
! h& W6 z# u0 t( p" @; O代码展示) b$ t, B. ^& Q$ F

* e: m4 E: A0 W3 Tclass Solution {$ j  k5 s! o; W5 s3 l; g- g4 i" X
   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# K2 M( ]2 {; w
       Map<Integer, List<Integer>> children = new HashMap<>();
  N& e2 X8 X) m" Q  p. x  L       for (int i = 1; i < parents.length; i++) {
# z3 G$ k# O; p6 c: M3 ]           if (!children.containsKey(parents[i])) {( W# v& }7 Q+ C/ K5 d
               children.put(parents[i], new ArrayList<>());
  H: p7 E) o% Q) O. Q          }
, Z" c3 i% H' _, g* U           children.get(parents[i]).add(i);
, R( p: S% @# i# K      }% j: n9 D6 f7 x2 g7 V, X' f
       int[] ans = new int[parents.length];
7 w8 H+ Q+ Q) y       dfs(0, children, nums, ans);  v2 e* r( V9 e' o
       return ans;2 Q$ }" y& w/ x2 J0 G
  }
' F! B, u' M& F2 S1 X. r9 ?' P- H4 M' H
' D3 v  h! p; t5 b   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {# `/ C1 P. F% T0 f/ i1 Y* {6 ~
       Set<Integer> set = new HashSet<>();! E' K6 S$ {$ i
       set.add(nums[cur]);+ X/ @2 O3 I5 ]( N  X6 S" P9 d
       if (!children.containsKey(cur)) {0 j  l% c! F/ ~( X
           ans[cur] = nums[cur] == 1 ? 2 : 1;
! ^) D! k2 s& L, H, R9 E% X           return set;
. \8 B' H/ k- h) y5 O. C      }
* }& W! [. p) |- Q& Y$ G' G       var child = children.get(cur);6 @  M/ o- j; j$ r
       int start = 1;
9 b- B6 l4 @7 S       for (var c : child) {0 _, h* w1 t9 f# F# z
           var r = dfs(c, children, nums, ans);
3 C4 N7 A' ]4 O6 x( m- Z4 K0 T           if (r.size() > set.size()) {' L6 F, k% w6 X! j$ @9 Y1 J
               Set<Integer> tmp = r;
( t1 j  ~3 Z% s4 U               r = set;2 `% N8 {' u, C$ _7 p3 R
               set = tmp;
6 @( R) s2 R2 z' p; G" B          }
) W9 R; Q4 d% C" i4 F& E           set.addAll(r);
; c0 e$ v' _8 H* |! T9 n           start = Math.max(start, ans[c]);6 C# T- H% O7 k' w' G! n
      }
  ]5 v2 r: T9 a  y" H* b6 y       while (set.contains(start)) {! F: Y" q: a7 q2 F; W* s
           start++;
8 }4 Y! P6 [: E% i5 x& l      }* r* c! s, H: K+ l
       ans[cur] = start;" Z: w+ h! G5 ]3 v8 S" \0 I
       return set;
/ t8 {$ {% X0 t  }
  u8 B, r1 j2 b}2 n8 `! j+ Y7 y0 Z2 c; j
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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