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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 句子中的有效单词数】2 {" A  r/ w5 w( j, B" U8 Q

$ U2 t' t6 Z6 w5 n解题思路" ]# [6 M  u! u& F1 p% u8 c
签到题。) G+ @8 c5 H5 c, B. l$ G6 `& ^9 X: S! z

+ q& t, S. j8 d* ]1 C8 `4 d代码展示7 ^  `( l+ X) r

+ \- q+ q  S! x5 jclass Solution {
% o4 E/ d& k  s3 h& l   public int countValidWords(String sentence) {" b/ P  Y+ b$ y- y
       String[] words = sentence.split(" ");
# q+ Q; w4 x8 T  f9 R3 E0 ^       int count = 0;8 i6 ~" g+ `& t- Z* y, j
       for (var word : words) {
% O" l8 j! k+ Q) X: U           char[] chars = word.trim().toCharArray();
2 a$ d" \% t% f/ f, ]& Q! v           boolean invalid = false;: a8 c* V- N8 o) v$ U+ e
           int index = -1;4 d2 L! w/ `7 ~# ?# R' ~
           for (int i = 0; i < chars.length && !invalid; i++) {
9 c& j$ ?+ j0 }# |/ r, ]/ i' m               char c = chars[i];  _7 R9 x1 R, I
               if ('0' <= c && c <= '9') {
% X9 I: c, D8 j- d                   invalid = true;, J9 U( R4 ^1 T! y
              } else if (c == '-') {
6 Z  @1 \" W( U& {) `' z7 q' v                   if (index == -1) {9 j9 s% D! v; _& b3 L
                       index = i;
7 m! K: }8 B5 W, I- R3 Y                  } else {. T2 A% B/ s- A# q. i  y
                       invalid = true;( _* L& f8 E* \6 y. p6 B2 V- O
                  }8 [4 r0 E; {/ D& a" U8 W
              } else if (isNotAlpha(c) && i != chars.length - 1) {
- L4 T* i+ m. ?% ?9 D' Q+ ?! j) Q                   invalid = true;0 p# V; ~9 z1 }8 g/ E: `
              }
6 ^) A! T; f* [  k: P7 L( E+ X          }! `* ?, K2 i/ M* A3 L+ a
           if (invalid || index == 0 || index == chars.length - 1) {; z0 D: Q' o8 O6 e; u
               continue;
, W# {8 E' h' Q$ w% S1 `; p          }6 F5 @$ I1 K4 C: E# M
           if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {
' g8 q* J6 P* Q8 ^               continue;
+ f0 N5 V# n/ r8 B4 [2 |          }* q' e0 D% D) B8 U+ P$ K& G" o
           count++;
1 x! d5 `* _1 x, D2 m# K. o      }
* ]) j( b$ ~0 D, [! b       return count;
) @8 c" W) \" o# D0 R; A$ e  }* K- z0 ^0 ?: s4 Z. z: j

; H8 p3 C$ G- d  C+ W. Z   boolean isNotAlpha(char c) {
9 p  w) c7 I; L) ?# O9 ]/ W9 ^       return 'a' > c || c > 'z';% z8 h1 l# c8 c& B1 j7 d0 W' |
  }  K, f; G  |( c6 {' `
. ]0 A- H2 N) n5 A; G/ E( c
}
5 k% c. W. q3 ~5 ^/ u
% y( c" ]: j( I8 Z【 NO.2 下一个更大的数值平衡数】) l) J# `, q4 Y5 h/ L, x

1 L4 `0 [# V9 O( a' Z1 C4 c解题思路
% @" q3 w3 ?4 g! t9 J枚举即可。
6 Y4 }1 p6 A4 J, O  ~) ~$ ~7 Q1 X5 L% G7 `$ y% t
代码展示
% m1 ^$ k$ s( n4 b, J7 {- A) a
: r( r: D: `) c& _! Gclass Solution {6 p5 }2 ]% T: y1 Y  l2 E
   public int nextBeautifulNumber(int n) {
! N* c; z# o; m) Q( S% \9 V       for (int i = n + 1; ; i++) {  r  \$ x+ N% X, G
           if (balance(i)) {% L2 g9 `( x2 b" L1 m/ ]
               return i;
7 `8 N- Q! _9 f) T& F/ m          }
* j1 u6 v( Y) Z) V5 Z      }
4 S* h( _9 w% e+ p! D& Z  }' O1 d' F7 P2 v  o* g: D

0 K0 X9 J% P% s* C- ~+ {   private boolean balance(int num) {8 I7 s  r( R. R2 }9 z' h
       int[] cnt = new int[10];
8 k# h+ @9 j0 J  x4 A       for (; num > 0; num /= 10) {$ n4 b. H# p; H- c7 Y' S
           cnt[num % 10]++;  R' [  T( |! f6 |! q+ A
      }! u4 C  ?2 i* G! G$ O/ I3 J
       for (int i = 0; i < 10; i++) {
' F5 B$ C2 S, h! t# D" T6 [& l           if (cnt[i] != 0 && cnt[i] != i) {2 u; K# V% ^9 {/ u# Z
               return false;
% r  q( Z6 o4 C% N          }
# k% H4 V: S( i: r+ ?      }
) {, A5 S5 f  K       return true;
% F% ~1 b0 O/ F. D+ |5 n5 L  }5 [: }, `- C# e$ M8 q
}; r2 v9 Q) w) S" w- u. G* t9 T
; [8 ?  }) l0 q5 |2 S: [9 d2 t
【 NO.3 统计最高分的节点数目】
: H7 u( c6 \; ~9 I9 J( R* J
% ?( W6 {8 B$ U0 r+ G解题思路
! c3 b+ y, C' p3 J5 a6 m首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。6 N* c+ B) I3 n% F) m* X& A* C

3 T% N2 o( S6 G  p% {0 t注意计算分数需要用 Long 类型,避免乘法溢出。) U  ]4 B/ V; z, `5 w5 Q

" C1 j% [6 Z* l! G  R0 P6 G3 _代码展示% M' ~9 E# X" c1 s# s' o0 p( K7 Y) V

2 f( t$ k- ^2 B5 ^% zclass Solution {
6 l1 |) f% O- }' O# \   Long maxScore;
1 y. X  {* M: f& u& r   Map<Long, Integer> count;
1 p5 M3 J+ o6 p. i: g7 L/ k4 x
7 n, K3 D3 v$ y# w( P" ^   public int countHighestScoreNodes(int[] parents) {
. R& W; o" Z, Q2 z       List<List<Integer>> children = new ArrayList<>();
" ^' [1 K9 G2 H% T; b9 W8 z2 u       for (int i = 0; i < parents.length; i++) {. m, I; K, y3 l3 `9 ?
           children.add(new ArrayList<>());
/ p9 h8 S* {2 A, @3 r  }8 a) f      }0 l' ~5 t9 R/ C5 Z" w* i$ m
       for (int i = 1; i < parents.length; i++) {6 I6 d! b0 |( X; G; l
           children.get(parents[i]).add(i);: w4 ~& O+ ]: {+ x% k+ K
      }
  L, m1 ?2 a, l1 e5 G) W! \8 L       int[] sum = new int[parents.length];  {4 J& m- g$ t
       calcSum(0, sum, children);: J5 B0 Y( P% e7 O& m4 |
       maxScore = 0L;
& i( [, t- {+ D) M       count = new HashMap<>();
+ ?, X2 e9 e% C' ~- f- f$ r" q. P       calcMaxScore(0, sum, children);
0 X8 ?# k- S) I5 o" N# y       return count.get(maxScore);. L! I% Q# k; z. {! K
  }
3 s4 C( v0 p- J# ]3 E1 F! o) l2 N1 u* c2 [" p7 I
   private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {+ _! g! r( n# [) K
       long score = 1;
! c. f6 t4 r8 ]1 X       for (var nxt : children.get(cur)) {2 G; o( ?; t; a1 [
           score *= sum[nxt];  h. m8 o" C8 b/ S
      }& N1 m# o8 @$ @) @9 Z, q
       if (sum[0] - sum[cur] > 0) {
* d2 g, b. ^6 Y! n! K& N- t8 [           score *= sum[0] - sum[cur];
" J: V" M( X% t% \      }4 ~+ f3 i0 t/ k1 E2 ~+ T
       count.put(score, count.getOrDefault(score, 0) + 1);  m  q; `1 ^) y+ |3 F& k0 |/ E* F5 D  E
       maxScore = Math.max(maxScore, score);2 X4 e$ k9 i* [* F; z4 w6 b1 L
       for (var nxt : children.get(cur)) {3 C$ t! T4 X5 c. Y0 w" b
           calcMaxScore(nxt, sum, children);. \4 {3 J+ r$ J, C
      }1 [% O: }- J- l& U
  }
" u1 h) P1 U2 R  w' i& |) ?8 ?' l8 Y
   private void calcSum(int cur, int[] sum, List<List<Integer>> children) {
+ x: C& u6 f( v# h$ f( J       sum[cur] = 1;
# U- L+ W  C9 X       for (var nxt : children.get(cur)) {
( C+ b& W: r  r           calcSum(nxt, sum, children);% g3 V! z7 V+ T3 l) e
           sum[cur] += sum[nxt];
" [( c2 O) w* R. k" d      }
% C5 Z8 F, B0 O  }+ o+ R6 T& _% p9 r& b# z' A
}
+ R4 e, T, M* s$ O
; ?6 S& q; G; j【 NO.4 并行课程 III】
2 z, `! N! ^# {# D
) Q7 o. P4 C8 V& v% f解题思路- Y/ E3 k/ ~9 F$ C4 O) e
几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。7 V) C( N( l% t0 u1 \

5 V. g1 u  B' D5 R代码展示6 a: S6 T; h5 }: d% D$ |

1 _/ L# b4 }7 g; b4 T; J" aclass Solution {
; ]4 b# B1 m5 g6 L   public int minimumTime(int n, int[][] relations, int[] time) {4 u# g( j5 L. |. f
       List<List<Integer>> prev = new ArrayList<>();
: J: n; X+ M' A' Z, \8 Y1 I       for (int i = 0; i < n; i++) {, ~( S8 L! }; x# y$ h
           prev.add(new ArrayList<>());
4 |( `+ {  T7 n+ a2 \      }
0 [' j6 [: @1 s$ C9 M       for (int[] rel : relations) {0 v7 K. m# m0 G0 P
           prev.get(rel[1] - 1).add(rel[0] - 1);! b. o1 k/ v: B- P" L* Q
      }
5 z% ^( i$ m* t; ]( w       int[] mem = new int[n];. Y+ Q$ ^; w# X- n
       int result = 0;( w6 t4 K: e  p7 `; R1 n
       for (int i = 0; i < n; i++) {0 R) o2 u' U3 ^' d- R
           result = Math.max(result, finish(i, prev, time, mem));. O& P4 b6 u0 ^: P* B4 |/ X
      }* ?* s% ^' ?- l; w# w
       return result;
$ J6 X! ]% H& o1 b( D5 y" A& T' M  }' a( R+ X. X3 e* A$ E
' B$ P" R1 U# T+ M1 J8 g
   private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {
& m( N' p' Y$ H: @9 k' P9 n# T' K       if (mem[cur] > 0) {( f& y+ W0 t$ `% K8 B/ S
           return mem[cur];; q8 S2 E, F% j2 c" j& w3 Y
      }
; y" f; }1 s- p! `1 V8 \' B       if (prev.get(cur).size() == 0) {; _* t: ^/ l* H/ f3 p  }
           return time[cur];
6 ^9 b1 g5 v+ V      }! k1 @3 c; b5 _! v
       for (int p : prev.get(cur)) {( I" N! E+ B4 i% O# l3 U
           mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);
. ^3 u7 q; ?) J. F7 P      }+ h2 ^" C" H6 \# y5 B
       return mem[cur];0 e& J3 B. v. M3 h& _3 q. r8 ^
  }
  p: d% U/ M/ C: ^, n% M; N, _+ j}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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