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

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

上岸算法 回复:0 | 查看:2237 | 发表于 2021-11-7 19:34:23 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】- _% l5 y7 F" o
解题思路( f& z3 Q' ?" S) e0 \4 e3 _
签到题。
4 Z. N. k9 V3 s2 C0 P7 _4 \% _8 K7 |+ r  O, y7 K8 V
代码展示, S! Q: @& I- L
2 E# b+ T& \) v  t1 @# z# @+ r* `$ `
class Solution {  R7 ?1 F5 G" s) N5 z& c
   public int countVowelSubstrings(String word) {! U: {, I" @8 H. U. a" P) f8 y
       int count = 0;+ b; }( I( p( N+ h1 \. ^
       for (int i = 0; i < word.length(); i++) {5 r9 O/ c' k) [1 @% Q+ a( R
           for (int j = i + 1; j <= word.length(); j++) {& D7 g% |; Q' R
               count += containsAll(word.substring(i, j));* \" W/ w" E& F1 R: l4 k' t! T
          }
$ u9 T/ q) e) i+ z- {      }+ E2 l6 k7 d$ {- V( W  }
       return count;
5 Q  V7 {  I& b+ D; I9 k  }4 L' h, N. z! J/ R
/ t& A& \0 d3 J. M6 R7 `1 I/ ]9 p
   private int containsAll(String s) {
  j, P, G, u6 T8 d' K3 C( l' X" A' D       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {$ I7 d( z/ T5 ?% m
           for (var c : s.toCharArray()) {
: b' w0 K- D9 l- p               if (!"aeiou".contains(String.valueOf(c))) {
4 c  w, V; {8 W" F6 C                   return 0;8 Y: F$ ~3 \; A+ @4 V! ]: g- r% {3 f8 }
              }
# y6 v* O/ Y# ^, z% {# `          }
! Q+ h- @6 d+ s& w           return 1;5 C% p% `- @9 k5 \' r' U" N
      }
7 p7 U9 a$ ^! X! B# F       return 0;+ F1 [+ o" `. @" _- S1 D
  }+ m) S+ T' \. e/ ^. V
}. J: H$ m* }/ N

) v/ m5 y, z  \2 q4 T! m; l【 NO.2 所有子字符串中的元音】
8 v! g! F- d9 S% }" j% W解题思路
: L4 P# [' `$ s6 T7 U依次计算每个位置的元音字符会被多少个子串计数即可。4 k2 {: x7 |8 U4 P
: q: J  w' |3 B0 V
代码展示$ w9 [" t+ {+ S0 o! k

: H* o+ D# A# o7 zclass Solution {
6 C  z" R, W9 T8 c8 B   public long countVowels(String word) {
1 V* T4 C) |% J# L+ W       long result = 0;
& i' |' ?2 a6 x" Q6 e) c       for (int i = 0; i < word.length(); i++) {
3 N/ I% H6 A+ @9 \" s. u0 g6 T/ y           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {" Q/ ^' j2 u2 i4 m! L) y
               continue;- z/ b2 u; _1 B. F! C) y
          }
' I- Y' Q; O: t) x5 o0 H           long left = i;2 S! C; M' O9 S  k9 m
           long right = word.length() - i - 1;9 P' C9 H8 y/ k
           result += left * right + left + right + 1;+ ~+ v% o, F/ _# r
      }+ h$ L& j7 j8 ^/ |: O( Z+ I+ p
       return result;
+ q! R" U. P; k7 c( i! X) |+ n0 Z  }
2 C& i4 x2 |2 Y}" c( L4 a& b) ]
  X5 ~! C5 O( h! |- R7 ~( k# h& h
【 NO.3 分配给商店的最多商品的最小值】& Q& I: o$ f1 G0 o9 L
解题思路
* I8 Y  ^$ S: {" j0 S" L' V二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。( k% V8 y' R* a" j0 \# k

+ Z! d5 S( h* {! u; ~* P1 u代码展示/ x' }: Z6 ^: a( s7 k

) [# @  i" G6 Lclass Solution {
. g8 y# N1 w8 n# g0 ], W   public int minimizedMaximum(int n, int[] quantities) {1 m$ ]* n7 H, E; C, N: o
       int left = 1;
% p$ F  l8 \4 y: G, C0 x       int right = Arrays.stream(quantities).max().getAsInt();
  f; f6 \. P3 N       while (left + 1 < right) {
9 \: q% P9 L. g  Z7 ?7 C           int mid = (left + right) / 2;
8 X  }3 c' o1 {( j' j& W- s( v7 C           if (check(n, quantities, mid)) {
8 H* f3 Y9 t0 M/ Z               right = mid;9 z6 }  l$ b. {9 A1 S3 ~
          } else {& X6 t. y9 o& b6 l- q1 O) l
               left = mid;! q! T* o1 u) E$ l# e
          }
3 c8 w! N0 {' M" d- ~! a      }
2 i, ~* a7 W. N( B4 t4 W# @       return check(n, quantities, left) ? left : right;
0 h+ V0 f' ]. |" j; ?" w  T( H  }
# S4 c- R. D* O* Y1 q- o% b, r8 M7 U) r, J) g& Y7 x$ a0 y
   private boolean check(int n, int[] quantities, int x) {
# D! g: ~% b9 l  v       int cnt = 0;: F3 E: q: m3 L
       for (int q : quantities) {
! p# _6 D! o/ ?0 I+ `! U           cnt += (q + x - 1) / x;
/ d, o/ j/ `8 p. `% b( P7 _      }
. Q; Z- e/ f4 g9 m       return cnt <= n;3 U" B% {* C4 z! {$ S2 f
  }& d/ H+ b+ F, A
}2 H. j( g6 m5 B( V) R6 @

; [- V/ m8 Q3 p【 NO.4 最大化一张图中的路径价值】
- ~* J. f1 B2 Y3 m解题思路
/ J8 }) F# p+ n' E% t7 ^看似复杂,但是观察数据范围,发现直接回溯即可。& u, \& v4 [, @3 k, V" y& _
7 ?4 x$ m8 d. Y
代码展示
7 H" `6 i& N$ U" U; p# Y5 j. t3 Y* x# d8 D7 x
class Solution {
+ P# h" |4 B4 l   int result;
! ?- s3 r: `, F) E& c0 k   List<Integer> empty = new ArrayList<>();! }3 U& Q9 f' _1 T

6 g9 E2 u& H9 ^: S   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {" x7 w- m% |2 o3 j" c$ }
       Map<Integer, List<Integer>> children = new HashMap<>();) P( e8 a; ^( q. A) H% b) m! F
       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();
# J, A# J2 o' q; _9 G. u3 D9 p       for (int[] e : edges) {
: S8 o- ]$ |- h$ _. d           if (!children.containsKey(e[0])) {
! p- y! r1 \) o! T/ p7 P               children.put(e[0], new ArrayList<>());& A" U7 Y4 D0 O$ S' }1 B  M0 I8 c
          }: Z% n8 I6 h/ d+ n
           if (!children.containsKey(e[1])) {
" D7 K- m1 ?1 m% }2 \% c- f               children.put(e[1], new ArrayList<>());' x6 P# }/ x, I" P2 m: z, {5 Q
          }" |3 a& f6 N- q0 T9 X) M
           if (!times.containsKey(e[0])) {
: X2 D7 N  e* b9 K7 t' S               times.put(e[0], new HashMap<>());: }3 E4 }7 N( Q/ K% f7 t
          }
1 N( ]) P$ t3 L* G* L: [           if (!times.containsKey(e[1])) {
* \/ Q5 k3 K% E! F8 z- W               times.put(e[1], new HashMap<>());
  o! i( O2 p( Q, \          }
* A  }0 l4 C' `. V  {9 A) r7 O           children.get(e[0]).add(e[1]);
$ F1 R. a- C; G: L: m$ q           children.get(e[1]).add(e[0]);
5 b7 p3 o7 M. M' `7 a7 E           times.get(e[0]).put(e[1], e[2]);3 I% K2 G" _3 Q) K4 }* a  D4 ]
           times.get(e[1]).put(e[0], e[2]);; g* C  }, d! X- q7 q4 i/ s
      }
$ o9 A/ h2 \; J% E; K' S       int[] vis = new int[values.length];
3 k. D6 b6 r4 J8 I1 a2 Y7 S       result = 0;/ {* F, Z- e5 ]
       dfs(0, 0, 0, maxTime, vis, values, children, times);
% z: {. m* K% ~$ y, a# X       return result;* p$ B# b/ B4 m2 w3 [
  }
3 q7 `5 o1 J8 J1 l8 o! ^
; {: J. o6 }+ H8 L7 B  v6 k# O   private void dfs(int pos, int sum, int time, int maxTime, int[] vis, int[] values, Map<Integer, List<Integer>> children, Map<Integer, Map<Integer, Integer>> times) {
; v+ b- p4 e4 l$ l( `  O- u       if (vis[pos] == 0) {
0 A8 |0 Y) D8 q, e! R" i6 a           sum += values[pos];1 ?8 H, [( J  _
      }
2 y5 X  Y9 f0 C: s       vis[pos]++;
( R! K3 p, O' A9 K7 _3 F       if (pos == 0) {: Q0 x, |7 @/ G8 R$ X2 i8 G' N+ O
           result = Math.max(result, sum);; r! q* [# r' x# l  L) |% ]
      }
" ]  r9 X0 @4 Y' a$ E7 q' V       for (int nxt : children.getOrDefault(pos, empty)) {
* B; Q" m4 I6 p           if (time + times.get(pos).get(nxt) <= maxTime) {
- v  Q5 ~, O) F& u+ }' ^               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);, Y# A8 Z1 \+ t3 _" B
          }
' c# i' @# L  f' j6 m      }' ^  c5 L3 C  q
       vis[pos]--;( h1 q" d7 `# g8 G
  }( V( Q! ?7 O. Q( G$ V
}! D$ j0 F- a+ R3 G# Q% s& _
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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