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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 反转单词前缀】& E% G& ?& |9 A$ p5 P) h- S
. o! J/ {4 g7 {5 v7 m
解题思路
- D7 ^2 l% h2 \, m0 Z* ^" d签到题。& C9 d6 ~7 S" h$ K' Q1 x( y9 t
& l- Z" W' r, a% M
代码展示
( G0 K: o" a& J( f, g3 ~' D. M3 N8 M* b& H+ Q! p0 c( ~
class Solution {
, R. o& Q8 t/ f2 Q6 X( {+ W; _   public String reversePrefix(String word, char ch) {
* ~& h$ C# X, N       int index = word.indexOf(ch);
3 T( t2 D9 r8 ]$ E9 O' E! S+ r: F" ]       return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
. c( r8 z; F, U. Y4 l7 m               word.substring(index + 1);: y! H! {$ ?- y$ _4 ?6 p& j4 h- @
  }
  n$ J! }! S$ p}
8 t! k9 n+ v+ S" w5 B& q5 N) l2 F. P) x: C& z; ~6 o) \
: ?- G3 C8 o" ]* M3 X

1 c+ @. L8 Y4 K' J% @: w
+ ^$ j$ x) c% {【 NO.2 可互换矩形的组数】& n7 C. D6 o1 f1 o, O$ H0 l% h' @
+ z% n+ z. d: O$ c- |  z8 O& U  h
解题思路
2 F2 b7 g  k0 ^% y: l将矩形按照长宽比分类,计数即可。% x, [* @, a; t, q7 z8 h
8 ^( H, l" \" t
代码展示
2 Y' u) X$ x: d
8 p8 `4 }! n& ~; d0 ~class Solution {  |3 @  N2 ^$ h. h4 q% {$ @
   static class Frac {
4 H+ q4 W% q. v. U( B       int den;9 z" v8 N9 h6 z+ A; d- v# A
       int num;9 j8 E. b3 v' e$ H( k. d% V6 J' ~, Q

' @% ?3 L9 |, a+ ?5 i: v4 L4 L       public static int gcd(int a, int b) {  g# t3 M. S# s
           return b == 0 ? a : gcd(b, a % b);
% X5 I9 A- Q4 R$ Q% n3 `" U1 Y3 `      }
) i5 S7 \$ l. E) B: q$ b# {& J+ f4 |% E: j0 R  ]) \  G
       public Frac(int num, int den) {
6 z% P" W/ ?7 B: j  I$ o  K2 L! q           int g = gcd(num, den);
$ l( Y4 n$ w% k1 L3 u           this.num = num / g;( z/ l- n  |+ }' ~) D/ j' u
           this.den = den / g;' U. b# {+ j' d5 [. s! N
      }
0 T1 s1 h3 w% r4 h0 Q% g$ W
) x# c' L+ q0 }7 R/ i       @Override
( o9 H; L+ h6 L. J8 N" z       public boolean equals(Object o) {- P# J$ U0 B' K& A1 n/ u$ W  V+ \
           if (this == o) return true;6 J8 Y+ u4 k8 t  R0 v
           if (o == null || getClass() != o.getClass()) return false;
# A+ a0 D# a& q; Y6 Q* E           Frac frac = (Frac) o;2 _3 A7 x6 i- I+ d/ h! K
           return den == frac.den && num == frac.num;
/ Z; m4 Q% ^9 a  [0 ?      }. O* J3 U# X, W8 |$ T8 ]0 H

- Y, |3 k, r4 c" {# z3 Z       @Override
4 _6 B$ M/ s* n" u       public int hashCode() {( n) g1 P8 P' A& C5 X: h: k8 K! O
           return Objects.hash(num, den);+ u- ^7 [- J% P3 i+ X; k4 z
      }8 v  U5 H; I" W7 x, j" V& ]
  }
3 h! K# s) Z# `+ K( Z; e/ }6 c8 T% b0 {# y, Y1 I9 @# c! O3 Q
   public long interchangeableRectangles(int[][] rectangles) {6 b: Z6 L3 z6 \
       Map<Frac, Integer> count = new HashMap<>();/ C/ W( n8 K* e. ]! o
       for (var rec : rectangles) {8 q/ |( [0 G# H2 {) V" k. ]
           Frac f = new Frac(rec[0], rec[1]);
8 K: Y+ D. v9 k' H9 a' Q  E+ M           count.put(f, count.getOrDefault(f, 0) + 1);
; S5 J0 R- @& X' b2 o, B      }
2 r+ `! c: h( h0 I       long res = 0;
, r4 o* {  M/ V9 e/ D9 l. ^       for (var k : count.entrySet()) {
$ e& d& B5 q% d  s7 z# Q           int v = k.getValue();0 R3 x9 `2 R4 Y4 J, E
           res += (long) v * (v - 1) / 2;. {, r$ I) i5 [8 d
      }
6 ^/ u$ I; D$ S6 R       return res;
% r+ C3 n; X. X# p4 n6 K! X  }1 j5 S" ^; F! A. ]
}/ S5 \! k# ]. S- c. C/ I1 \: X
$ y0 M& ]$ r, Z  ~6 I+ Y

  Z4 k6 f) a9 R: G【 NO.3 两个回文子序列长度的最大乘积】( k$ K% _' d" l% O
% g5 p. `7 w3 L( L, D8 h' ?
解题思路3 v$ F1 M- j/ k+ H9 g  R8 m( |
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。: L) o  S9 b" ]% K; c
& \* o7 r/ t7 u( t. T
代码展示, ^$ r( r& v2 n- u6 I0 a' h

6 m* U) W; H; q+ T+ `3 m! s& eclass Solution {
) g) g1 t5 T/ Q   public int maxProduct(String s) {/ N& L5 |8 q, U2 ^* R* Z7 u; S1 U
       int len = s.length();2 F- F6 w2 M! l/ _# j' G: n
       int res = 0;- Y& n5 x0 M( j! P
       int[] mem = new int[1 << len];
4 k7 j8 @! w  ]) j       Arrays.fill(mem, -1);/ Z# w0 q. M, d; \
       for (int i = 0; i < (1 << len); i++) {" j) C% b# ^4 s
           for (int j = 0; j < (1 << len); j++) {# T3 T, ~/ b3 a  z4 h$ \- L) \
               if ((i & j) > 0) {3 Q& W; {- ~5 V6 O
                   continue;
7 O9 W6 u* c7 n/ _8 c+ C# }) o              }
/ E7 u" A: |3 k0 U& o2 g               res = Math.max(res, length(s, i, mem) * length(s, j, mem));
) t* P& c2 U1 P1 f          }
$ P/ h7 i' W  B+ N0 p4 W0 I      }
  L8 r8 y: U" [) j" |2 P( D       return res;: `" D4 u# f; X5 c/ E0 |
  }
" C4 B; Z4 K' `8 c5 t- r
* [  g: r# C: J8 B   private int length(String s, int bitset, int[] mem) {
3 y! p7 O/ Z* b, W3 _! s       if (mem[bitset] >= 0) {
* k: ]+ ~. P1 j0 M4 k0 E( r           return mem[bitset];  y+ O" a# N& T. _
      }& X9 p% N  J; I, K  J& W" D$ B- j
       mem[bitset] = 0;2 b' M* a0 E$ ?" @  n1 f9 d9 ~
       for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
# b1 S  ~; D4 V3 }! D           while (i <= j && (bitset & (1 << i)) == 0) i++;
) ~; T' g+ U" Z( A/ ~           while (i <= j && (bitset & (1 << j)) == 0) j--;+ q: u. m5 c. I, W/ C
           if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
! ~, s) Y2 [9 ]: m               break;
" s& b9 e. `! o  l* `7 a          }/ K& ]! A3 c4 O" f& V# M
           if (s.charAt(i) == s.charAt(j)) {- s/ N, C& ?8 E: x: k
               mem[bitset] += i == j ? 1 : 2;. _" C: |* h$ P. L" ]
          } else {
+ g4 ^: ~+ V5 N5 h/ \' F8 R' X               mem[bitset] = 0;  N: ^3 `' @) l$ c
               break;
" J8 ]3 D3 L# G' {8 J5 F          }
$ K7 a& x" b: }/ p2 T) n      }! z( y1 t% E, W9 [! o' a, \" B4 w
       return mem[bitset];
8 d6 j' f5 }5 F0 b8 N, O  }! A' r# t  i, y3 c
}( F! t2 S, |3 X4 j' \& ~/ W
! H* p8 X3 ]2 H5 c; H
, T% U9 s6 i( i6 y
【 NO.4 每棵子树内缺失的最小基因值】
8 R7 x& Z- j3 W: {7 K$ T
. @" E$ Y0 a+ x0 p" B( a, p, S解题思路
: E0 q+ e2 v4 i/ Q# s) y* n1 nDFS 合并 Set 即可。但是有两个优化很重要:5 c6 ?+ s# D" W$ P  V% P1 ~

' ]5 _7 e3 I" C* ~( e! B0 r" b1 Z9 r1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
5 d8 E. D/ z7 d/ M# l9 l  U! {/ n' }% l  U: ?
2. 合并 Set 时由小 Set 合并到大 Set 中% Z5 \3 R; [9 H! |0 W" r- W# d+ B
. ]6 j/ x8 A3 W8 k, ?* l  L# F

  g. q5 ?1 E0 M  S8 i4 O. y3 c% Z/ ?代码展示/ Q' a% o; d3 T/ r5 I- Z

/ B4 u( V/ }: ~1 U- z' G5 i% `6 Vclass Solution {2 _# B( H) q; b. e  W) Q1 e
   public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {7 J. s7 M. v$ l2 a3 }5 O1 A
       Map<Integer, List<Integer>> children = new HashMap<>();
- u& j7 t% ^/ U  D+ W9 t9 s       for (int i = 1; i < parents.length; i++) {* g  |* V9 ]0 c  T. L/ _7 _: b+ ~2 T
           if (!children.containsKey(parents[i])) {
5 j9 f3 H. k" I0 k" n               children.put(parents[i], new ArrayList<>());, d+ ~* I3 B" s" \& Y9 p5 j' \
          }
7 }( }4 r! U% [& ~           children.get(parents[i]).add(i);
* R1 g6 w2 `% ~3 E2 }      }; B9 t; d/ v8 P: a9 m+ q7 P
       int[] ans = new int[parents.length];, u5 o6 o6 M& |; [* e( w0 l1 |
       dfs(0, children, nums, ans);' X; G5 c- q! l5 `, O( v3 o+ h( f
       return ans;$ ]. Z, c) W- G6 C
  }' b* O# T# q9 \' n9 e

' M- a5 K2 t5 S$ ]+ t   private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
  ^. H3 @" S8 F  Z5 N# x9 A       Set<Integer> set = new HashSet<>();
; F1 B/ C4 B. Z, P& i, W       set.add(nums[cur]);
3 O9 v( r% T5 ~1 H3 W8 p       if (!children.containsKey(cur)) {
! T3 m& A4 |1 ?4 e           ans[cur] = nums[cur] == 1 ? 2 : 1;
# F0 c" Y0 z. k           return set;: {+ I) w+ v# Y/ ]9 J
      }
: `" W( [( H9 B% k% S$ s       var child = children.get(cur);
( a9 k! Q( ?) g       int start = 1;& R* U2 u8 n. T1 Y( J0 V4 o
       for (var c : child) {- H, y  c6 f  \, z4 \
           var r = dfs(c, children, nums, ans);4 L$ s7 G& O; h4 U
           if (r.size() > set.size()) {
! G0 |# v: c. ~               Set<Integer> tmp = r;4 q4 Q2 k$ g/ A  v% g; Q5 v( w
               r = set;
, j6 L9 j4 _  w6 w! N8 h) j               set = tmp;
8 s" n% E0 J: P/ i- u$ z( A$ v$ V8 b          }
+ ]) A$ m) p# F4 c' h# _           set.addAll(r);
/ R" o; k! q7 N( N. V$ p           start = Math.max(start, ans[c]);
$ s; F  ^7 E; |- c" k      }
: ]  r7 a$ q6 p& i3 c5 }$ H( Y       while (set.contains(start)) {
, ?/ O8 `/ A. m" a7 Q           start++;
/ H# d" W: M) r7 t& u( H' F4 x      }
& T+ O2 G" C/ i! G$ c3 X& I       ans[cur] = start;
' f& W! `5 x9 z9 i1 h! ^1 c  G; }       return set;" e! ?0 Z5 ?& M/ @) X  a; |- r
  }
- t9 e! _) A) y3 |}2 s. T8 |) m" k& B1 \
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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