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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 句子中的有效单词数】
! u' ~# M" ]; [
! B- U" X1 ^5 l' A# K9 z解题思路
. U" f  v4 S9 s, H签到题。
( }8 y& m4 `1 q! x$ d% c/ e' V9 x. l
代码展示$ I  }$ j) W0 ?) K( \) B" H

# U0 ^  s& l: T7 |. p) e- U  B. vclass Solution {' e( _2 ?: {4 [9 g" |7 I
   public int countValidWords(String sentence) {
2 S. H+ p* b& c& Z( v       String[] words = sentence.split(" ");
6 H; d9 A5 p# P* u- d       int count = 0;4 F9 {0 E" p+ p
       for (var word : words) {
  Y8 m3 r! g- E# z           char[] chars = word.trim().toCharArray();% X! X+ y" P; T% m9 M0 ?: _5 y
           boolean invalid = false;4 i8 n) }6 W- S$ i
           int index = -1;) A# P6 Z) [+ t) V
           for (int i = 0; i < chars.length && !invalid; i++) {) w% m$ \* E; q/ u
               char c = chars[i];( p' Y( u# `5 N9 d9 k6 i
               if ('0' <= c && c <= '9') {
- `% |1 @3 n* Y: }) q' A                   invalid = true;* g" u5 N- U9 O" E  w: `8 h6 V
              } else if (c == '-') {
( s) }) {, f) T                   if (index == -1) {
) a9 x( q0 D- |. J- ]8 l                       index = i;
, w! ]- Q1 W; h1 o8 K                  } else {6 ~" a  r1 h* N* C
                       invalid = true;  h; m$ J2 r3 N4 K3 M
                  }) O" S% U" O5 t$ Q" S
              } else if (isNotAlpha(c) && i != chars.length - 1) {
7 o5 r/ m1 T4 z% m% j: }; b8 U                   invalid = true;$ `+ V4 V5 o" E# u; o
              }2 D7 f7 i1 N/ Z# M: f$ N; E. k
          }
" `/ m; j8 R$ i8 n8 |           if (invalid || index == 0 || index == chars.length - 1) {, }5 S) W* Q- U, o  k$ o$ e
               continue;
2 C' i/ B0 p5 |          }
+ K+ r. m% |* f           if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {! h/ F( p* v1 S; a
               continue;. h9 U0 f" [. T! H
          }. @4 ]& r) P/ _: o( Q! i
           count++;) A9 z. Y0 @6 j- O% q5 L9 d9 g$ v
      }
) }1 e4 _0 \2 A. K, R) ?       return count;4 n* }+ k( r  `7 W* J: M3 {2 Q
  }
& m# u) S' \- M; L. w3 a$ ^$ n2 h! C  s: K4 G3 |5 [8 g# ]" P
   boolean isNotAlpha(char c) {; Z6 o4 m5 O; i3 j
       return 'a' > c || c > 'z';
/ V" f7 a+ T) }* S6 A4 n  }/ R6 h, b, V! e. p

0 l+ {4 [9 N+ ~+ X$ g}
+ y( R9 K$ A: ^
# L5 N# ?' b) M: w8 E' E& \【 NO.2 下一个更大的数值平衡数】  @' m% K8 v  o6 _; G8 s
/ T* r/ c& A9 C+ ~$ ?' L# ?
解题思路* \' m7 |) u7 v; S
枚举即可。
+ r+ R) ?" p$ @1 L  T7 W4 E9 Z( d4 t0 i0 b) o, V0 X, c
代码展示
. }  ?7 b. i$ C6 u( B) A+ p. w$ b' |" r2 L# o4 @
class Solution {9 Z8 x) ^& o" z. _8 d" J) K3 a
   public int nextBeautifulNumber(int n) {  D% s4 i3 N/ O% b% t
       for (int i = n + 1; ; i++) {
6 K. S- T  {3 w. P5 F! l3 P           if (balance(i)) {
2 v+ z) ]9 e9 _2 S- ^- l2 ]* n* |               return i;
* B/ D4 |3 m9 a- q          }  y- D9 A/ g5 q; m( W
      }; ?* M# s) G$ Y& ^" n- }
  }
: ?8 {& V; {2 [- O  ]' x" P/ Z; x! c
   private boolean balance(int num) {) D/ J8 F. `' s: J- C
       int[] cnt = new int[10];
& J5 C- p" y4 X: T       for (; num > 0; num /= 10) {0 I/ X  k3 Y0 L  V
           cnt[num % 10]++;
3 L- q. M7 _: L0 F) f4 u" o      }
1 H: P3 x0 y+ P7 }" k       for (int i = 0; i < 10; i++) {: W7 {9 d# T! L. X% x4 O% x
           if (cnt[i] != 0 && cnt[i] != i) {$ p9 k: D6 v* n$ |' z% G
               return false;
; l( A/ G9 p* E          }, X0 U1 t# |6 j) c' U. E5 E
      }
% P0 ?$ g: i# q. z3 R1 {       return true;
. B4 ?+ V" y8 m& y% w; l  }0 n5 }8 B  H4 _& K( P4 A" R
}: {& ?! U5 x" p

$ O8 ^/ H+ {  g% P" @$ \【 NO.3 统计最高分的节点数目】
3 @/ a6 v; I# {
1 y+ w: I' G% J1 [解题思路
1 W& o9 f3 v& S" B6 \4 w; u' Q! _' l首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。6 N; c$ {& [8 K  h
5 v5 l/ ?2 ]* B5 T
注意计算分数需要用 Long 类型,避免乘法溢出。
. [+ V" i: h1 \( z. W" Q5 {5 ]! x$ g8 W" v7 k( q3 U! L
代码展示
& P9 `; A' d- z; s, }, s, [& Z. u3 F0 F# E1 Z
class Solution {
+ {' ^: V, g1 v" V1 \+ X   Long maxScore;
, c  g4 ]2 N6 F* M. q   Map<Long, Integer> count;' }, B& @1 o6 ]9 D* X0 S' j- `
8 i; Z5 X, I4 |, p
   public int countHighestScoreNodes(int[] parents) {
* `" V6 Z$ v3 z$ |       List<List<Integer>> children = new ArrayList<>();
) I. O  r, V% G9 @  I       for (int i = 0; i < parents.length; i++) {+ q' ?! a$ W9 l8 h$ f3 t: q
           children.add(new ArrayList<>());) s+ e  c3 o4 g
      }# S( @7 o$ h6 q- \- M3 O
       for (int i = 1; i < parents.length; i++) {
7 x1 Y) L+ w6 [& ?7 b& h           children.get(parents[i]).add(i);2 q2 d; D7 `: h+ Z% {! t/ U
      }
; a8 @4 N1 j9 W) G' z       int[] sum = new int[parents.length];- n, u: }6 c- n% m1 C7 C5 m
       calcSum(0, sum, children);
  ]+ i" |  m' I. g  }. F- [( P       maxScore = 0L;
, ]8 N$ k. S- f7 P% w7 D& z       count = new HashMap<>();* ]4 L1 n0 q3 B- u
       calcMaxScore(0, sum, children);
# x( }& Z( n7 A! Z+ R       return count.get(maxScore);+ Q* H& q$ S( `7 W9 l: n4 O
  }
% ?4 I! e9 d! W5 V; v; d4 h# ]* X- _+ `/ D, v; N! H. [0 g
   private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {1 A, ^2 P9 u, d2 A) W
       long score = 1;, F+ p2 a3 }. U0 T; t% Z! X
       for (var nxt : children.get(cur)) {; U' Y7 y. V. B: p8 O
           score *= sum[nxt];' \! o% u  f6 X4 ~' x8 h
      }/ x" o; Q6 x) D4 ?# R/ r$ M
       if (sum[0] - sum[cur] > 0) {
  z* l: X  s; k. s- S2 k           score *= sum[0] - sum[cur];. b9 g) S: o7 L! D; V0 Q& g# ]9 `
      }: z0 f. e1 n# a: Q9 n" _5 u4 R- _
       count.put(score, count.getOrDefault(score, 0) + 1);' k6 e1 _  r) k6 A: R$ W
       maxScore = Math.max(maxScore, score);
8 _" ~) v. O: c* D, D       for (var nxt : children.get(cur)) {
6 p: L: |( d: ^2 ~7 _/ t           calcMaxScore(nxt, sum, children);
  }& t5 p; r: c3 S- N      }! T; l. n: k7 |/ ~
  }
& Y) o" E$ ]; \% k0 t( @* U/ Y
: Y8 R1 y8 {  V: U   private void calcSum(int cur, int[] sum, List<List<Integer>> children) {2 I# q/ b* X) x/ k( k
       sum[cur] = 1;
# z) ]$ \( ], @9 |5 {2 X4 z5 N" F- T       for (var nxt : children.get(cur)) {4 D4 [) H1 L  x; @0 f& E
           calcSum(nxt, sum, children);/ p7 G$ O) `( R3 @! ]
           sum[cur] += sum[nxt];2 P4 m: q" ^, V
      }
1 ~# `5 I3 _3 L4 n/ Z  }) G9 X! G" |9 b3 b' G& G( f
}
+ l9 O  y( m# H5 s' y2 |6 h# _% o8 p$ _9 H- A
【 NO.4 并行课程 III】
& Z* V9 h. x& v0 G) I4 \1 P: E: e0 R  R) F7 [
解题思路
6 M( }3 a' V1 V9 t几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。
1 o  N% m5 A6 D2 N- F- R- u5 a' Y% ~7 O3 X8 i3 o7 h$ R. p. l! x8 B& ~) l
代码展示8 N- R' L0 F& r3 ~5 y8 K% P3 Z/ M

" I0 c0 S! \* K7 m* ^class Solution {
- L* J* V& e1 H) Z   public int minimumTime(int n, int[][] relations, int[] time) {
% w' B" h6 [! Q6 l) y  S       List<List<Integer>> prev = new ArrayList<>();
" T: G' d. A' d: W0 n$ S6 A       for (int i = 0; i < n; i++) {
- |2 F: ?5 I) z, y- k           prev.add(new ArrayList<>());
  {  W& h: }- s, N8 w) \      }
$ k. t+ k- G0 [1 ^& Q       for (int[] rel : relations) {3 N8 g9 J) a0 E. n
           prev.get(rel[1] - 1).add(rel[0] - 1);
; z$ e# X- [8 G      }
' d4 A3 J4 E3 c6 S7 Y       int[] mem = new int[n];
6 o6 m0 `, M$ L       int result = 0;
( w/ p8 ^9 S6 O       for (int i = 0; i < n; i++) {
$ u; a9 o; O8 y' ^           result = Math.max(result, finish(i, prev, time, mem));
2 d0 g; M  k1 X6 C6 w      }
/ q9 b  O# F9 Q5 V& X" Z- [6 [       return result;$ M( {  K/ {7 L" z2 `
  }
- C7 o; r) \9 R
* p; u, }$ c$ a. j   private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {* \4 z8 c- n6 G; ^' g( ~& i$ v
       if (mem[cur] > 0) {
  ?* w1 v8 ^" b4 I% u           return mem[cur];
$ H' V8 i; f9 d; r1 `      }
* z( Y3 k9 \, ]$ A1 D       if (prev.get(cur).size() == 0) {* Y# A. W- N6 f8 x& l, |
           return time[cur];
0 S) c) Y5 K6 i2 I9 [$ Z      }# n6 @: V: v/ A
       for (int p : prev.get(cur)) {
7 L- e2 I: l1 ~, b           mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);; ^# L: Y( W5 v- J1 c7 \) H% U) a
      }. D# S$ B( _, r, p3 @! L
       return mem[cur];
! |) |+ {6 F; o7 J- E. ~+ w/ c  }
$ a: s7 t! M: D! C9 o/ Z  L}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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