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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 句子中的有效单词数】
. o/ }- l$ n6 m0 O4 B% g6 @: Q8 N. J3 P( t$ y  R5 G' N# `3 y
解题思路" k1 ~6 c5 p; t2 G: |
签到题。
! j8 ~0 `! `& U) ~9 p; t5 d2 K
5 W  Z, v' I. W代码展示
. E1 X- H* [& D+ ]
, k7 b% l3 c, b) w* v  ?3 Qclass Solution {
* w2 @# S- F$ C* Q7 ^   public int countValidWords(String sentence) {: Q8 L! C% l! b; P7 H
       String[] words = sentence.split(" ");1 Y% ~7 i9 b" R$ ^% l$ t
       int count = 0;
0 U5 W  o, d9 |" \/ q6 P       for (var word : words) {2 U" u. e, @$ d" b- ^) t
           char[] chars = word.trim().toCharArray();4 I9 D4 |- o& N4 v
           boolean invalid = false;
) h5 R1 U4 q2 C2 V  b) K3 F1 ~           int index = -1;# ^( y& ]4 ^$ Y% q9 B3 @/ y  u3 x" H
           for (int i = 0; i < chars.length && !invalid; i++) {2 {9 Y) `* J3 c4 j
               char c = chars[i];
0 |" Q8 _$ ~6 U) J3 Y               if ('0' <= c && c <= '9') {# [4 F) Z9 f; D: w& X5 M, K+ m# e
                   invalid = true;
  G/ }( E0 R7 w- ~! k              } else if (c == '-') {
# B( C  J& N7 F* J4 q- j0 g                   if (index == -1) {
/ e! u8 S8 o: d# C% Q3 q                       index = i;
& E$ c- |. K9 s* {                  } else {, t" Q, ]5 M3 L8 N" P1 v$ B
                       invalid = true;
; }0 D, C+ A# T# j; F" s: ]                  }5 v* k8 T% |; I; \& V. y
              } else if (isNotAlpha(c) && i != chars.length - 1) {
3 N/ f) D2 `; o- h" D" R/ U                   invalid = true;
1 K' h; j& P* J9 l" {              }" f4 U( W. f! q8 e' h: ?
          }- i) _  P- v! m8 w+ @
           if (invalid || index == 0 || index == chars.length - 1) {. f% M& n, h5 F! ]' J! ^
               continue;7 y' m/ x+ q" M
          }
0 X8 W5 W* c0 h+ x" l           if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {0 o6 }& v  \7 c" s
               continue;+ O0 X7 P! }8 J7 C
          }
" K; I' K5 Z/ p7 m0 E% t) p           count++;
) v- K/ Y- ?: A" r4 Z3 z      }
( o6 \$ P9 r1 f: M; R$ }       return count;
2 X! [0 d% O1 y0 t9 Z! `: |) `  }1 [. ^% i1 E3 S) u2 @. l

9 V; O/ H6 A5 Q$ t   boolean isNotAlpha(char c) {' E; R8 ~4 p) q" f
       return 'a' > c || c > 'z';& i; e0 B7 w4 i3 _6 q
  }
" N. [; H0 L3 c0 ?) u- R
( u6 t. g/ w% ?5 ]; V}4 ^' Y- h# i, r/ m$ Y  ^  ]$ E7 q
+ a* }- o* w9 w: U
【 NO.2 下一个更大的数值平衡数】
6 u+ a- ]; n( E( B6 r1 [$ k9 Y
4 I) u$ s2 V$ \5 a) d解题思路5 b! R: L$ w2 @; H' ~
枚举即可。
% f; ?$ _3 G. ^5 m9 d. {$ C
, B7 O6 _0 a' v* R! j1 R0 v" i代码展示: m+ b9 W; i2 g& Z/ ?
# D5 {, t/ V. k8 H5 y: u  g8 O
class Solution {
; z, _8 |2 K% e) o; U  R5 @   public int nextBeautifulNumber(int n) {
* h/ ^1 _9 K( d, ~3 q       for (int i = n + 1; ; i++) {* }6 {. ?2 P$ m. h
           if (balance(i)) {
) J, p% }( K' s7 [6 I! i2 u: Q. J# V               return i;
6 L7 w6 B+ H0 _" N2 ~6 I          }+ s8 K5 y5 W% a5 Y
      }/ H, K# R  K9 \3 C2 h
  }
, d& E' q3 a* c- |, }3 F4 z7 K8 d5 j0 q, P: c, S, L% J  m
   private boolean balance(int num) {
1 F! @# ?/ A0 L7 E       int[] cnt = new int[10];& w6 o+ l1 Y, u7 E+ S" `$ j
       for (; num > 0; num /= 10) {
% {9 c, O# c7 T* j  w5 {           cnt[num % 10]++;
* e* ]1 y2 o+ I) w: r      }. D: i) z% o8 R4 t/ ~3 a
       for (int i = 0; i < 10; i++) {- X$ U5 Q$ }' `& D1 a5 _
           if (cnt[i] != 0 && cnt[i] != i) {
! g4 ?+ H6 k. Z1 M; n( J4 h/ g               return false;2 s" ?* P3 V, l1 K$ [# }
          }! J% t" d- i$ G$ P' o: d  w/ Q  M* c6 [
      }5 a$ R8 y0 @! y! U( Y) j
       return true;
  e3 ^% W, x5 Y6 \/ |3 ~9 ]  }8 Y0 }1 R( Q7 m
}3 k; C" M7 d$ i' L1 S1 T, p
2 P1 }9 |) t  U1 C% J
【 NO.3 统计最高分的节点数目】/ z3 T; {4 q2 b- \/ W% ~# G6 ~- D
: t/ Z! E! x; w5 l( _! O
解题思路
+ X3 n2 |& d/ A% `+ L$ f, s$ l首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。
9 r$ B4 s) i8 p  U( T* W( c4 G2 g* P# O# v* v8 T
注意计算分数需要用 Long 类型,避免乘法溢出。5 H* e1 V' d, }! g2 |# @
6 l: V  g5 |6 T5 m6 |' p# f
代码展示
  e. y8 e4 n; e/ E" h+ U, E0 X9 X4 y! W; W7 s
class Solution {' s' l! G; Z0 R. |
   Long maxScore;
0 L  ], {5 N( F4 g- _   Map<Long, Integer> count;' u) j% M1 s  Y/ d# @" s. Q) p

6 p# L6 N& Y" _' H+ a   public int countHighestScoreNodes(int[] parents) {
5 V8 }* E  D- Y       List<List<Integer>> children = new ArrayList<>();7 M. u2 _7 }& u7 I
       for (int i = 0; i < parents.length; i++) {3 b; K" I4 p/ j6 |+ T
           children.add(new ArrayList<>());7 |: q1 o/ n" y. H$ z
      }
8 K' V! i" {0 ~       for (int i = 1; i < parents.length; i++) {1 \- k+ T, N6 b: Z2 t  b+ M
           children.get(parents[i]).add(i);! O1 x. D% }  U3 \, s5 y' C
      }
* e/ c, _1 A# l6 l* L5 R0 h       int[] sum = new int[parents.length];0 U1 u) q+ j6 `
       calcSum(0, sum, children);
( u. Q6 s# Q4 B       maxScore = 0L;: }1 e" [% k% B9 y
       count = new HashMap<>();
, d" ~# |  D8 }       calcMaxScore(0, sum, children);' M1 D$ J# C5 J, l9 \- X
       return count.get(maxScore);. ~" o- W2 E9 n' z/ o  k
  }
# S% Y2 o6 z' v0 K- k2 y1 L
6 j9 D* H0 e& U2 X5 @5 f/ {   private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {
: x5 F6 V$ H# i/ M4 v       long score = 1;
% `, ]0 ^, E' x       for (var nxt : children.get(cur)) {5 O$ d8 {$ f. {# M2 J( Y: o+ v
           score *= sum[nxt];$ s9 y/ s$ m, y% Q% c& s: s/ l% @
      }
8 S0 n/ y: E1 N, Z  b, y       if (sum[0] - sum[cur] > 0) {
* C3 Z+ ?- L* \" U: @  b           score *= sum[0] - sum[cur];
  c7 Z4 m  n' ?( X      }
9 Z, S) _4 ?$ g3 T( l( O, J7 ?+ j8 V       count.put(score, count.getOrDefault(score, 0) + 1);
. {. A, v" z" X; g- L$ I- `, B       maxScore = Math.max(maxScore, score);8 ]0 T5 F3 Z; R5 e
       for (var nxt : children.get(cur)) {
9 z( B- D# ?6 j0 Y. l* e           calcMaxScore(nxt, sum, children);
- I8 c' @& @. T9 K, a6 h( e      }
" k3 V0 }* n9 u3 x" k  y/ R  }
  f6 O& i+ g  d* u4 |" e# G( s- W( C+ ]* U8 [' L
   private void calcSum(int cur, int[] sum, List<List<Integer>> children) {; E) E" D$ P) A0 ?$ E
       sum[cur] = 1;
. |% D- {7 j6 h; r5 U, X       for (var nxt : children.get(cur)) {% b$ Z; L0 n. ^3 V
           calcSum(nxt, sum, children);
7 e7 X8 |% Q2 E           sum[cur] += sum[nxt];
1 X' e  r; k* p4 A# A0 E      }% r7 ]& L3 f, i, d' C2 M5 |
  }
+ g. |9 Q' c0 V' s+ q}# H! Q. K  ~* E6 g, ?

6 d. C* }. G6 b! C, V: k  B【 NO.4 并行课程 III】* ~1 M  a" M3 J/ j( D) u  @; m
$ i6 o/ t& q$ n# r
解题思路- p! w/ r( Z# P7 C: K% V& b# @
几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。
, I$ e& c# F/ \6 i( U6 D, I$ b
1 a! M! z: T0 Z$ v5 Q7 H( D  G代码展示2 k0 @4 e* O6 a4 h' X

- Y1 n) o4 S7 |6 C: ^; oclass Solution {( i& M7 g. N4 M( F; p" j$ Q" _
   public int minimumTime(int n, int[][] relations, int[] time) {
! L" j- \+ m3 o5 o9 J8 H' f, Q       List<List<Integer>> prev = new ArrayList<>();
1 r% {3 S, B2 a$ Q; b       for (int i = 0; i < n; i++) {* H1 z5 v# R- e0 T' P: [
           prev.add(new ArrayList<>());' p; @5 K* x+ N' V5 g. N/ l
      }$ M( k2 A9 n: n8 R8 L
       for (int[] rel : relations) {3 H5 x2 s& P8 z2 i  m: [! n
           prev.get(rel[1] - 1).add(rel[0] - 1);
3 h( ]- x2 l6 |1 p5 }. v, P      }
# Q! I0 G# Q3 R7 m       int[] mem = new int[n];
3 m  o& o. q8 P+ H. ?4 _       int result = 0;. o' R+ E& u/ K
       for (int i = 0; i < n; i++) {! O1 D+ \5 z- u" H
           result = Math.max(result, finish(i, prev, time, mem));2 A5 k% `3 z  z! L2 v+ G
      }
% |- _. D% r$ V. A# A       return result;% \; L% u  |" R, F( {( Y; \  E
  }# {1 m" q* K6 W& ?+ k8 Z
5 F# M  B3 l" U9 z
   private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {
1 `! X2 ]6 U4 C. A+ P5 T  O2 L       if (mem[cur] > 0) {, S5 |0 O7 m. p$ w' ?$ ^) I' q
           return mem[cur];- N- b+ E, v* ]- B# J$ z( u2 x- u
      }
9 K8 y$ _; {8 v. d) z       if (prev.get(cur).size() == 0) {, F+ m* j! ~; d; t  @' }2 {+ ?1 Y
           return time[cur];, U# j: k: X8 W5 i) V' z
      }1 K! \0 o0 h6 v- Y# q
       for (int p : prev.get(cur)) {: x6 r, Q* L! t+ F/ M6 _8 M
           mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);
/ Z7 ?7 c2 E6 @- q6 y      }: p) y! T% o8 g
       return mem[cur];. ?; J4 B" g% s! j! j, j
  }5 x8 [" N- H1 T# v/ F- e
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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