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

[吹水聊天] 上岸算法LeetCode Weekly Contest 264解题报告

上岸算法 回复:0 | 查看:2492 | 发表于 2021-10-24 17:33:11 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 句子中的有效单词数】
" d8 e2 n  `1 K0 Q3 l" {! @8 r
2 V, [/ d- ?$ W9 q# ^解题思路
$ [) ^2 A2 n4 W* Z, u- x签到题。
; S) c* M# c. p$ |& v& l- C0 J, A
+ @  w4 z! v- ]9 [8 z% ]1 s: t代码展示( l9 b) ^# w+ W7 [

/ W# Y3 Q7 J9 v0 _  k) Kclass Solution {: b9 Q# D( d9 M8 R7 I  O  d
   public int countValidWords(String sentence) {8 p4 Y. y" H( }4 A0 O. a; S
       String[] words = sentence.split(" ");
: S: v0 l% U4 x9 X3 ?+ j       int count = 0;& g% a, R9 n# [5 A
       for (var word : words) {
+ B" R. M! \# W' ^           char[] chars = word.trim().toCharArray();
! c, D$ V! ?' S7 [           boolean invalid = false;# Q1 g! ^5 v; b
           int index = -1;$ p2 [9 o4 X$ z) f/ p+ J6 }( k/ c
           for (int i = 0; i < chars.length && !invalid; i++) {
& x* z& u  @: T  T               char c = chars[i];$ s- k- |% X$ A( i# N  ^
               if ('0' <= c && c <= '9') {
3 o& s  v) v: f; D9 s- c0 P- L- u                   invalid = true;
) K9 Z$ W9 J& U8 }# H" P9 V* G0 |, M              } else if (c == '-') {
6 p! ]% E6 K' u0 j                   if (index == -1) {; x1 ?4 W# V. [
                       index = i;
# y) _5 S# |, V9 ?: o+ Y                  } else {
" ?% j8 K2 Z8 F# j                       invalid = true;
: s& s+ c$ L% M' ^9 j8 D                  }- L0 L( }/ z1 }) h. Z
              } else if (isNotAlpha(c) && i != chars.length - 1) {7 g2 c6 T7 O, P. A
                   invalid = true;
7 ~0 r' s/ a- o2 S              }2 E# c  n" R& w# S/ k1 m8 _' C
          }
  V6 `) ]6 F9 D7 K' t           if (invalid || index == 0 || index == chars.length - 1) {$ d$ C# l8 F* D5 N: _8 g0 d
               continue;% @9 M: @& \& U; J0 j, x0 G- \! g- ]
          }
. p6 Y: F5 D7 o; @9 G           if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {
  k* {$ A7 q) ^& ]               continue;
, a3 ~9 C$ k, X5 |* r          }" b5 }) ^: c2 l& M! h
           count++;
" a% k3 j; O2 E      }
; g: F6 r% i% w4 R. f; a       return count;0 I; v+ t* E! C8 Y; ^' n
  }9 W+ J) h" |/ }

' A: G: B6 ^' Z   boolean isNotAlpha(char c) {. b0 R3 r; h6 _7 f
       return 'a' > c || c > 'z';
$ \0 X  V, a# Y  F  }5 {$ d  Y! j& r* J+ b+ v
  S4 X. }# Y! h# z- B
}; u* {* ^3 e! R5 z6 W

6 F! g3 I* P6 d" s7 [% P  k2 |【 NO.2 下一个更大的数值平衡数】. S- u% W0 [3 ?5 L9 V8 u

/ z; x  w: N+ Q4 h解题思路1 @8 A; I! q; v  J6 Q  h. |
枚举即可。
$ y, K) d$ @) M4 x2 F4 z; E! c  w3 r# q" [1 M  l+ T% |
代码展示: z* y0 x8 E; F$ m4 h* i: x

4 v' j+ ], r+ n  ~7 hclass Solution {, P5 V. a5 f# y  m
   public int nextBeautifulNumber(int n) {  @3 ]' o) a/ l4 C' L# m4 H. [
       for (int i = n + 1; ; i++) {
' ^& R1 ~1 F0 X2 O. l; w           if (balance(i)) {$ c/ F, }0 w0 H# \) x( A# I
               return i;( Q, W- l; {5 s! c
          }5 K8 `# B% t: |6 |* G1 U
      }
! v* S5 j. w5 K# {  }0 u) {$ ~# X. Q/ {, y

% K. t' \8 `4 |5 Z/ t$ z" Q. m   private boolean balance(int num) {0 U8 j: U8 @, Z7 Q: r
       int[] cnt = new int[10];2 b4 E% H7 C7 T" A3 \+ h6 V
       for (; num > 0; num /= 10) {
- A, V% a8 R+ @5 p" L! _+ w" Q% @           cnt[num % 10]++;
6 g1 e# E6 o1 @4 Y$ i2 U      }0 x4 ?. d! t. \: V/ x3 i
       for (int i = 0; i < 10; i++) {
. `% Y" U' M- |4 d1 }3 Y           if (cnt[i] != 0 && cnt[i] != i) {
  c& i7 E8 ]) ~2 x1 z: |6 ^8 S               return false;3 p. ^9 O6 U: L( {( V6 ?5 ~1 N& f
          }& L8 {7 S3 l8 o7 _2 [" A
      }4 @8 Q; X, A: f0 H7 y
       return true;
3 F5 P9 P- s, U2 f$ r* n  }+ L" ?$ S/ H" S1 A# F: F
}
3 {% w$ o. e- \1 q0 z* |4 N
8 m/ J4 ^2 M% ^, ^* n【 NO.3 统计最高分的节点数目】
0 w/ H1 g5 _, G: V9 {' t! i9 Y# c* G. T4 w
解题思路
" D* P0 t) h4 S$ J! ~2 i首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。
' t7 z! a$ t* v- m9 V$ Y* S4 ?& t, t  m7 D4 ^; z$ v: t& r# k, W* F1 `
注意计算分数需要用 Long 类型,避免乘法溢出。' g2 N/ G0 i6 t; f& E
' p) L8 N2 C1 t% Z7 L
代码展示
- U# ^5 j. y( Q+ H
6 G3 S. x( L; f/ s0 d% I0 aclass Solution {
8 T* x" L4 Z0 }: c  \; l5 a   Long maxScore;
6 ~4 [9 d4 f) N& V1 [2 {+ \   Map<Long, Integer> count;
* z  e. l4 ~* G1 [% x6 |
; ?) e3 Y( ~8 c: p   public int countHighestScoreNodes(int[] parents) {
! B# `* t+ y# @5 U       List<List<Integer>> children = new ArrayList<>();
3 I1 H  V: ~6 u       for (int i = 0; i < parents.length; i++) {5 c' L+ X. Z) I0 U2 L+ R: R
           children.add(new ArrayList<>());
1 c" |+ \) h6 b5 f      }& e; C2 N- S0 i0 w
       for (int i = 1; i < parents.length; i++) {
( X1 T: u% d7 x           children.get(parents[i]).add(i);
6 a7 h- x8 W; N3 b      }3 s* O! W% {% v, y$ j
       int[] sum = new int[parents.length];& T; n3 i3 l& h2 w- p
       calcSum(0, sum, children);; X" y# Z! g9 j1 s+ n; |; [
       maxScore = 0L;
4 @! D: d9 g6 {+ V5 x7 u       count = new HashMap<>();8 ?+ O. I/ k  C( N
       calcMaxScore(0, sum, children);/ D! h+ ~5 R9 ~) f0 C  P5 c
       return count.get(maxScore);
/ o/ d+ X: g) y; Y' H! `  }
7 t$ M8 c1 k& V" d! b* d2 r% P3 N; i5 D4 a6 O- L! D
   private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {6 m! w$ C4 V0 ]2 G! `1 [
       long score = 1;, V  B0 E1 z) M" L( N0 O) f
       for (var nxt : children.get(cur)) {9 J8 _! z+ u+ Y; y4 H% I" ^0 B5 X' `
           score *= sum[nxt];/ a; z6 H' x5 Y
      }
/ f  b( X" l; T& U1 e8 s$ |' _       if (sum[0] - sum[cur] > 0) {
. u( r: Y7 q# I9 ~9 O( i" H4 h           score *= sum[0] - sum[cur];. q8 |" ]( q& t  g$ t+ G0 T& j
      }
4 K) E! s1 H  Q8 i: j% }, E+ ^       count.put(score, count.getOrDefault(score, 0) + 1);8 Y7 G- Z1 L$ n: B' K5 a
       maxScore = Math.max(maxScore, score);
) ?) ~- T) W0 \7 S3 y0 [8 Z4 z( ~       for (var nxt : children.get(cur)) {' \, [: a) M9 G* X" ~1 L3 i
           calcMaxScore(nxt, sum, children);
% I4 t. O" h" g5 S      }
! N4 w$ f. @* V0 n6 S; F* X; p  }
7 G; G8 @; E: M' J: [! t
% _9 y% }  r' Y$ q6 `+ C   private void calcSum(int cur, int[] sum, List<List<Integer>> children) {
0 R) T9 n! L2 y$ W( G       sum[cur] = 1;
! c2 b: V6 ~( ]1 [       for (var nxt : children.get(cur)) {' z- d* ^8 S& |; a/ }
           calcSum(nxt, sum, children);, K1 u, o8 w. X# Z; G/ C& l" O
           sum[cur] += sum[nxt];0 n# e- ]0 o; C! M& A' `
      }
* Q2 P2 B- |' e/ C+ n! E& {  }
% G1 r! N3 G: Q! c1 R" K: f}
# K% D/ x2 [; f/ Q
$ j' m, M% b5 S& m【 NO.4 并行课程 III】
) X( |  ~7 A7 f" \( G& H
$ A  ]+ X9 Z; a7 \- f9 [解题思路
/ D; n. D8 u2 A. s5 Y几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。  w9 O8 [$ O' y/ u# j
! Y& ?; z' y& Y% s; Y/ i/ T; u9 t; p5 i
代码展示
  _+ o- k% Q% n5 m& Z5 \! M
& D, E) K5 k. v5 _class Solution {
& C1 I9 e8 B  l. N; q   public int minimumTime(int n, int[][] relations, int[] time) {7 F4 w2 m6 E" h7 i$ R
       List<List<Integer>> prev = new ArrayList<>();# A+ y8 p$ \2 N; i
       for (int i = 0; i < n; i++) {
) L* y2 K. U+ z1 i7 ^           prev.add(new ArrayList<>());
* ~  v% H; y2 s2 n8 G0 l      }
8 r+ |! j' G9 h9 h; o4 g' C. p       for (int[] rel : relations) {  X. H- I8 L5 ~1 d% |. i
           prev.get(rel[1] - 1).add(rel[0] - 1);7 L6 G+ C) J& y8 O6 h. z
      }
7 E2 b& J8 c) p/ T! R3 U2 Z       int[] mem = new int[n];1 R! y: A2 w* V/ y9 e' h
       int result = 0;
- E+ E2 u  g- K/ j* R% j5 R1 Y$ `       for (int i = 0; i < n; i++) {
6 _) M; ?4 S) E; _. d           result = Math.max(result, finish(i, prev, time, mem));
, @3 F* V. h/ \  G& `. \+ e      }+ @# b: g( c" c9 N8 y9 ~& |3 w
       return result;
& Z% i! g. [, e  }
9 s' x  C+ _! N, x  {% A9 [' Z6 \9 v0 @! m+ u5 c2 h9 C
   private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {8 T8 Q, \3 }0 r; u7 J# s- P& N
       if (mem[cur] > 0) {1 ?7 T- d$ q2 J
           return mem[cur];
1 N; X  p  j9 f* M) Y      }
) J& \9 h5 i* V' L6 n, _+ e; M# W       if (prev.get(cur).size() == 0) {
# u; x  c7 q+ l9 c           return time[cur];
1 n! e; t7 K- g4 L* C      }
- \, R3 L% J$ l: F( d       for (int p : prev.get(cur)) {
% T) b- i) y2 C5 h           mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);' g# L& G$ e, S9 J0 c
      }! f4 z- o+ _- n
       return mem[cur];
/ _0 B4 B4 c9 j' t. A  }8 h' f" j5 r  W5 x, N
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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