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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 句子中的有效单词数】# v+ e2 _; z; Y" `
, X' ]: D' w1 v  a2 r
解题思路6 t0 y, l" {4 I7 T3 @) j
签到题。
( P9 F4 C' |% X* W3 m& @. j
- y9 Q5 y+ X4 u代码展示5 r4 J$ k8 \# c
$ E* w# Y; w; H" x3 j
class Solution {4 W7 [. z. k+ q% W. C9 F7 D
   public int countValidWords(String sentence) {% ~; o" Z: ^% Q5 W. ]/ H
       String[] words = sentence.split(" ");& S# C$ m, T* D2 L2 L
       int count = 0;1 ~4 ^9 p; ?3 b, ~, Y9 @
       for (var word : words) {2 j( t8 c) e" {- m: H3 R
           char[] chars = word.trim().toCharArray();
4 Q0 @$ |% q' ~1 m: n) K: c! B           boolean invalid = false;
% f% f4 w- Y5 I7 L) l           int index = -1;$ ]5 o" B6 |7 V
           for (int i = 0; i < chars.length && !invalid; i++) {1 B( }4 W" w! g7 s. g6 `# |
               char c = chars[i];
/ K5 o2 V/ T0 K' j& K               if ('0' <= c && c <= '9') {; k4 ~9 F/ l1 e
                   invalid = true;  e  Q7 r+ W8 k& O4 V
              } else if (c == '-') {
) T2 @% L2 A' w; R% ]                   if (index == -1) {0 w8 F( @- f: U2 j  q
                       index = i;2 d# u3 H/ J; A0 m6 ~  f- s$ G" w8 p
                  } else {
6 v9 z' Q4 ~% F% ], G                       invalid = true;
  w7 T7 d" J) p, t                  }2 w5 @6 W* ~* l' F5 I; B& _
              } else if (isNotAlpha(c) && i != chars.length - 1) {
8 r+ D* p% N8 c                   invalid = true;
6 j& ^* `8 j8 k( z9 n* y9 \0 A              }
4 u7 _( h$ U3 c& C. D$ z          }9 \* k- B) {4 c( [
           if (invalid || index == 0 || index == chars.length - 1) {& p8 g( h) b% h! ]6 k  ~3 a
               continue;
- ]3 y& x9 Y8 B6 V' I7 `  [          }
' x* z" f- _5 @7 n; X) [# D+ z           if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {
/ I. S5 i, U% S! f5 K0 ^8 N4 R               continue;
' x: \. z9 d. o( d" N: K" _          }
! f$ u, Z  n8 z: x* G           count++;
9 t# y& o1 m0 \4 }  _3 f      }8 P9 e1 H2 t0 w3 M* y" o- K
       return count;
- i# ]- v4 \& r' {3 X) d. o  }
9 F* y; N" {' x1 d% S8 ]
6 B6 l, V8 S- [4 `' Z6 y' y/ ?$ R   boolean isNotAlpha(char c) {
1 u4 Z6 B2 ~7 X$ Q       return 'a' > c || c > 'z';
( y4 }& ~& `9 s8 H# r+ B4 y- M  }8 Y& U1 l% X' G6 [, A
2 i- `$ m# b  t; ]+ n8 A7 {; T
}
; F4 B$ I# U3 _8 Q
) i' I8 J$ D5 h& q4 N) a: ~; x【 NO.2 下一个更大的数值平衡数】1 X8 L$ h: l' L; r! q& r1 m
* U9 p$ Y3 _* c# x; @
解题思路
! Q" T9 f# {  w& ^( s6 P枚举即可。) k7 L: i0 \# G) e2 N' d& L" z

- I- l5 I* P; V  {, X- G- M代码展示
# @( z/ X7 W8 v# Y" K$ _/ a! j
6 _" E% m6 G/ _3 m; ]$ G# Rclass Solution {
. q) ~, x$ Y& u) P1 N   public int nextBeautifulNumber(int n) {
5 q0 c# R" m$ o6 E& S( K! o  `1 e       for (int i = n + 1; ; i++) {
( H( n& \" e/ m           if (balance(i)) {' O  _$ ~& ?4 G- p3 P
               return i;
) l" g4 A1 g3 \" w3 l          }
/ X$ t! b. Y/ r# G: S      }9 |. q7 [+ E  _
  }
- w5 Z. x& y% {; Z' `  E# p
" W- e$ ?# V/ ]: ~& d5 u   private boolean balance(int num) {
# G  k; Z. i6 y" a1 }# l: x       int[] cnt = new int[10];
$ y0 Q0 ?; m; ?1 o8 [& U       for (; num > 0; num /= 10) {  v+ w. f% d) `. L
           cnt[num % 10]++;
. D7 L( A" z% R$ E/ N- z      }
  o! V, ]. n9 s+ K9 d1 [+ ]8 F       for (int i = 0; i < 10; i++) {4 Q! ?. Q1 ^2 B: D$ s1 t  @
           if (cnt[i] != 0 && cnt[i] != i) {
; t+ A; s9 m% Y, s; q0 Z  p! I2 \               return false;; s6 l% F7 a4 D4 @
          }
- B' @: n# [. q, c      }
7 Y( ^4 O% V* U2 S$ t1 P. `( R       return true;
6 S* r7 x2 m! d7 d( E  }3 p+ a6 W4 r: @# ]
}
7 ^. d% F( V  V4 z) l+ |
1 |3 M, Q8 C% h; S2 {【 NO.3 统计最高分的节点数目】4 O& p7 x* p8 Z+ l$ l4 Y1 m

0 C- O; `  A9 H6 y$ u3 j  F. A0 x解题思路
9 T$ N6 y# _' v# A+ }+ i) }首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。
. s  _0 q" r4 l, q$ K
1 V- A' o! N& w% d4 P0 s注意计算分数需要用 Long 类型,避免乘法溢出。
7 D+ C2 o5 g/ x. L; e3 ?6 B' N8 D1 S" C3 V
代码展示2 v* T# l3 Y) W8 E* Y
; ]' E% f& s5 Y
class Solution {
& N* g% b  x" J9 F; N. r   Long maxScore;
# }) y. [* E7 z* G$ ]) w5 e2 V* y   Map<Long, Integer> count;+ Y+ w3 i9 k: m
# c; R2 f' c0 b+ ^  v  b+ S9 O: C5 }
   public int countHighestScoreNodes(int[] parents) {! j, e' @* ]; X, v
       List<List<Integer>> children = new ArrayList<>();
% e/ ?" [3 X% g* l8 _( R" S1 y       for (int i = 0; i < parents.length; i++) {- m3 w' u4 w* u
           children.add(new ArrayList<>());
; Z. F- W7 C' O: v      }
( L; X1 a, ?. I8 [1 ?% j+ b% F       for (int i = 1; i < parents.length; i++) {, T2 w5 w! }6 L* k% X
           children.get(parents[i]).add(i);: W$ d( f! c6 W' g/ e; J
      }1 f6 r; P' V4 k
       int[] sum = new int[parents.length];( P; E2 A3 p) A7 S
       calcSum(0, sum, children);
2 ~& W' z6 D) c$ b$ e       maxScore = 0L;# o2 W4 X! H% z. K, E, }$ S" `3 C
       count = new HashMap<>();  N+ o- b, G( f8 s' c$ N
       calcMaxScore(0, sum, children);( E  B' _3 {: c% E0 X1 N( }9 C
       return count.get(maxScore);
: @8 T1 c6 f* Y  @7 Z  }: V( T, a: \4 D2 O$ v  F, }

. B. Q" X- u" o& R& U   private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {+ L$ V" B3 g9 f6 B3 R: |7 `
       long score = 1;$ Q$ f& M3 u0 x+ H
       for (var nxt : children.get(cur)) {
7 H$ w4 G. I7 p* y5 T; I9 X           score *= sum[nxt];* n9 T, N) @5 k8 l5 C6 `! ~. z
      }
. A1 L0 ?5 f: ~. _$ N" x( T       if (sum[0] - sum[cur] > 0) {
. a" c2 X' J. L0 u* J. p           score *= sum[0] - sum[cur];3 \. t( C+ \  A3 O, x/ w
      }2 T) N9 A1 i4 T9 H1 ^% X, Y
       count.put(score, count.getOrDefault(score, 0) + 1);
2 I. y, o* j! @       maxScore = Math.max(maxScore, score);# O( K! d: ^* b7 T5 O* m
       for (var nxt : children.get(cur)) {( u, X1 q+ j! O: a! L, G
           calcMaxScore(nxt, sum, children);
2 c8 i1 p* ?* z2 Z, s      }
) n5 z: M) J  r  }
8 w3 }: v! U/ V( V& r& {+ a* J' R# a! C7 [* H: G
   private void calcSum(int cur, int[] sum, List<List<Integer>> children) {
* r! x! W# U- m% K  ?: {       sum[cur] = 1;* a. X* K7 H* H* t$ R
       for (var nxt : children.get(cur)) {
; X  O( z" m. y  ~% @           calcSum(nxt, sum, children);3 j' }5 B1 f. A- ^: _# g
           sum[cur] += sum[nxt];
  u" J9 T' l( a! V! N- I4 H      }6 }3 @; k" k" \# ~% w5 N) ]; F- N
  }" w. K  H' f7 Y# z7 Y/ O, G& ~0 @3 Y
}
: M: W4 d5 [$ ]( Q) A4 X( R/ Z' w% o% {# s
【 NO.4 并行课程 III】  C! }- i; V$ W
  T) z1 s, s4 M/ Z2 [
解题思路
% @/ q' N# X+ _5 q8 @几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。
' j: `! V/ F2 R  P" w4 H
/ B; R3 }0 S( m0 A9 T! l/ h. D代码展示
4 {6 ^3 ]8 `( j4 ^7 C( r7 Z% L3 A: y+ e+ a2 r, q
class Solution {/ h3 E% J$ `( l7 J; K* R
   public int minimumTime(int n, int[][] relations, int[] time) {& n! E; U' G" ], ]9 |
       List<List<Integer>> prev = new ArrayList<>();) f% N- t. P+ {4 d# _: V
       for (int i = 0; i < n; i++) {
8 S4 b" R7 @7 k3 @7 m* c& e           prev.add(new ArrayList<>());& ]  {$ S; G; b
      }
; U' `% ?* @2 h( Z3 k       for (int[] rel : relations) {; h# L) Z- R8 @" V$ j6 `5 a/ N
           prev.get(rel[1] - 1).add(rel[0] - 1);: ~' ?5 s, i2 }) L8 G' _2 W. d
      }
6 `& ]" S, r* y0 t4 c       int[] mem = new int[n];
  Z8 K% P0 B! x4 C       int result = 0;
! a* |" a3 I& b/ M1 A6 i       for (int i = 0; i < n; i++) {# A7 ~: \. ?8 h& n  W# O* V
           result = Math.max(result, finish(i, prev, time, mem));4 H+ N! I# o. m+ T" c
      }
% F) e+ W$ U# w7 T' ~       return result;
& V- u4 U: @% [9 ^! E# y  }
1 j5 l$ L0 r' _4 y6 M% Y
: ?- a/ z  V$ c   private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {- ~* b( _: A3 q1 L5 r/ N, K
       if (mem[cur] > 0) {
5 ^+ f: p% j, q5 a: G+ |' G' C7 F           return mem[cur];
2 Z& T) V% w/ q6 w2 g      }- y* i# b0 l8 D/ M; `  ^: S
       if (prev.get(cur).size() == 0) {
/ e, Q2 Y; x) r; }           return time[cur];6 d4 Y" Y. P/ o9 u
      }
! f& b9 P& p9 m2 x( v2 @       for (int p : prev.get(cur)) {4 }" {$ K2 K) T& |) f
           mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);) u% }$ s' K- x
      }
5 h) v- d) M2 e, L; z# F6 ]+ V# i       return mem[cur];
* n4 B4 z8 [6 M  U0 ~, c  }! f% t/ u4 O+ ~$ J6 H* l" c
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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