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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】
! G4 ?. w# l& l7 h2 _( a解题思路
3 H" o! ^# [, w) M& N签到题。8 E9 m) k; F5 S4 l
% p1 |0 [: ^# t& Y% q
代码展示5 H4 }! A5 s. q
3 a  M0 h0 ]# P8 B9 ?
class Solution {0 n0 ]" H) Y1 d& H% B4 o* y
   public int countVowelSubstrings(String word) {5 Q; ]4 B) o+ i. i  \4 e
       int count = 0;0 X8 u, C! l* D0 a% o
       for (int i = 0; i < word.length(); i++) {
' B& B/ {2 e0 ?  T: z- x3 B5 c: v7 W           for (int j = i + 1; j <= word.length(); j++) {
$ J7 v& C# m4 [+ G, [* d5 X1 ^               count += containsAll(word.substring(i, j));- w+ t8 @  ^; T- I( Z- g
          }& S1 N0 K1 A$ W. I& {' X6 ?
      }
8 r, c$ E! p' P- U, S       return count;
/ a4 l0 T8 u+ F- J2 _* O5 Y  }) s1 u' D, R& e" e; m

6 I) j! E' x! s: ]   private int containsAll(String s) {7 j# W# {/ h: T2 s6 l8 i+ j0 T
       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {) D; s; p% {& M( j& L+ S# N. D
           for (var c : s.toCharArray()) {: v( ?2 b/ V6 [
               if (!"aeiou".contains(String.valueOf(c))) {( s' r$ E6 C8 u
                   return 0;6 L6 ]& [2 c9 N' _) a  w
              }
5 M4 h" o+ d0 \* l: S          }
1 A5 W2 p1 u6 z- }5 D           return 1;- v6 J* K8 A2 C% Q( \% n
      }
. U- a7 D# c# B: C" Z       return 0;
1 Y( \& e+ O! Q6 a& @' P( \$ A8 N. q  }
% P; i' J* G, D3 T}* |3 a( ~2 n  o) i( x

% X& e$ d& {9 B  z0 C【 NO.2 所有子字符串中的元音】
* G+ c0 K- @# E' g# F5 K解题思路
& O4 k" D. A7 A  k4 {: r, k8 Y依次计算每个位置的元音字符会被多少个子串计数即可。
  b: h: w( Y( P9 E- o
& e0 U0 }8 {; p代码展示5 y" m$ l+ l1 s4 G, N7 b. a4 R
$ B7 O- Z- h% a
class Solution {4 L7 \5 G6 G- V7 {& D* s  L7 k5 f
   public long countVowels(String word) {' q2 V7 j4 ^3 K8 [
       long result = 0;
& L7 m) ?" u. E/ C       for (int i = 0; i < word.length(); i++) {; ^: C$ r& I# h
           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
! ?# F* x1 h. B, M) `! F               continue;2 ]3 m6 `: c# u$ M, o$ [/ I( ?: e
          }6 Z3 }7 D) F5 a: b9 K2 l$ e
           long left = i;/ U+ \+ b3 \! {( J4 e( U
           long right = word.length() - i - 1;
7 t1 d% H% O. z  S; h+ p9 u! c           result += left * right + left + right + 1;( ]: c, y' @0 X' m
      }4 Z/ L2 o) `* x  X+ O, {
       return result;
6 m; E1 N4 c& M8 I- X  }
7 a9 I/ e  j; L  Z; L}! y; G  c4 O0 _: r
. B. w5 E3 {. b/ v9 h* \3 d: l
【 NO.3 分配给商店的最多商品的最小值】
8 f) A) {) W* f/ i7 x+ `解题思路
1 p8 l) N* E! |二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
+ d; f% u/ I5 f8 V0 M. C: t( [: p% `( N0 c
代码展示" L# x$ m( a$ B% Z) ]
! U  }6 W& ?6 i& W7 Q# _
class Solution {
# H5 p9 Q- n3 f3 E   public int minimizedMaximum(int n, int[] quantities) {
) D0 c3 U- o: S) n' n9 I/ t       int left = 1;
$ `* k0 |& Y4 ^6 [       int right = Arrays.stream(quantities).max().getAsInt();$ }9 p7 T& m8 e% {
       while (left + 1 < right) {
8 X, C8 N/ k3 R1 K/ P$ W9 O2 `1 ~- @           int mid = (left + right) / 2;* @+ T4 z) P# f# `' \, O) b
           if (check(n, quantities, mid)) {- h8 d, Z1 A% G6 n; k# {  g, x  _6 u
               right = mid;& q7 i& l5 L- b3 x* }* [8 R$ Q( W
          } else {; K: Q* W3 T7 g7 ^3 W' s, N4 c
               left = mid;
, x. e' P3 a5 z: n          }- a2 p: `0 S7 F
      }7 Q/ w8 u' _) v9 U, |1 r
       return check(n, quantities, left) ? left : right;
2 d$ a8 U3 h/ Z) r; Q% }5 i  }' b' u8 s* T( {' Y

: X; U% A' R9 g   private boolean check(int n, int[] quantities, int x) {2 F$ K7 h8 W' K1 b( C
       int cnt = 0;) ~+ ]$ l/ ^2 p* Q4 V* Y7 J8 u
       for (int q : quantities) {
6 D  B6 m5 g. w9 W- C           cnt += (q + x - 1) / x;
# d- n1 B7 `" q( [      }! j  q+ S% n" p7 ?- o. N
       return cnt <= n;
: q! N7 I$ K7 V) J- H2 G+ v1 ^  }7 l! r/ S8 T+ `6 }
}
- c6 ^, ~+ s- z3 b! h
3 n+ r9 E; S; y% F3 @3 M9 P【 NO.4 最大化一张图中的路径价值】$ S4 x4 e3 r3 [1 }; i
解题思路
6 y; D- Q$ S1 J看似复杂,但是观察数据范围,发现直接回溯即可。2 }+ L" t2 I1 t. U9 S
7 e7 ~, C' ^% @% L; X
代码展示
- H! M( m( }+ k/ e( X0 S: b$ ?9 ?# y% g/ x3 w+ ?- s% N9 t
class Solution {
2 _2 e+ g+ ]& Z7 O7 c   int result;' C' Q- k- A8 c) ~
   List<Integer> empty = new ArrayList<>();6 q9 G; `9 u9 y# }$ W7 G, N9 o
, r0 ]/ _, d$ P0 z* U
   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {
5 w4 z8 X$ a- E# e) B       Map<Integer, List<Integer>> children = new HashMap<>();
4 d, Q  e) W" |       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();9 T9 A6 H3 I% l! E" f
       for (int[] e : edges) {
' p! {: ^8 v& ?9 x           if (!children.containsKey(e[0])) {2 R4 r4 \0 p% p. y* e
               children.put(e[0], new ArrayList<>());! l0 f* C- `: n4 o" G
          }
0 P; Y/ n( _8 d9 {& c* {) ]6 G           if (!children.containsKey(e[1])) {" K' J- D2 Y/ a, T$ P
               children.put(e[1], new ArrayList<>());
: ~9 _" |: H" ]/ Z* Z8 Q          }9 C6 b3 ?* Q+ A$ q4 ~
           if (!times.containsKey(e[0])) {
# H8 k- }1 D. P               times.put(e[0], new HashMap<>());% \; B  A% {3 X/ C
          }* {5 d7 d5 C" y( P- i& h
           if (!times.containsKey(e[1])) {! K9 [, ^7 Y' t
               times.put(e[1], new HashMap<>());
* ^: H7 t+ v+ ^2 z          }7 K, y8 m8 t* {4 ]6 s
           children.get(e[0]).add(e[1]);
1 k# ~& C  }# u4 w8 ?$ c8 Q* G           children.get(e[1]).add(e[0]);
- Y6 M6 P! i: l3 p8 b           times.get(e[0]).put(e[1], e[2]);4 s: n0 ~& S- W6 ?
           times.get(e[1]).put(e[0], e[2]);, h* \4 ~# W6 R
      }
4 O1 p9 @) i3 W/ X0 z       int[] vis = new int[values.length];
( Y% w  b6 [6 b/ W& ~7 ?4 h       result = 0;
3 a& q; O. Y7 {4 O* k; A3 e       dfs(0, 0, 0, maxTime, vis, values, children, times);
; Z0 d5 c; A& ?& V& w) j9 n9 i       return result;
- F. o8 b# T/ q) F3 U& f$ I  }* i3 [. @# M. m0 P$ s, Z

0 i+ q# Q9 _3 Q  A   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) {) ]8 m/ {" d( q0 x8 L2 n- g& W
       if (vis[pos] == 0) {
+ u( L+ W' j) n: h" ~& \( b           sum += values[pos];  ^% r. c% `  }/ l
      }0 W/ U* O2 l# ?1 ~
       vis[pos]++;4 M4 V' @2 M& X9 k1 [
       if (pos == 0) {- v- W$ d5 k+ [- f/ j$ U
           result = Math.max(result, sum);
. J: O; D; S0 f# R3 e      }
  o2 d! v3 u. d" z$ m       for (int nxt : children.getOrDefault(pos, empty)) {4 W. x% W) M% @9 T1 T
           if (time + times.get(pos).get(nxt) <= maxTime) {
6 ^( t1 j7 b7 O$ @               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);
! v! p4 Q/ q$ h7 T          }
3 K: ~1 z$ K; [9 t* N      }
3 m& K+ o, l" z& u2 X       vis[pos]--;) ]- R7 ]. a( u# ?( p" y6 b
  }3 [* h3 m2 r9 c% E$ V
}
* d: G0 d# e. T: o6 O  R
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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