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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】5 i: o0 c" B  j" ^0 u0 p
解题思路
* W4 n, b+ V8 k4 P2 t# o签到题。' R% Q  Z8 |% X- @# {
9 i8 Q. L; d' c& a2 G0 ?( q3 N
代码展示; P9 I% W3 y& M+ C

& s$ [: V# \# X+ e7 [& B  b' j2 Iclass Solution {
2 I8 }' S  z4 D1 J   public int countVowelSubstrings(String word) {
. T; k4 U! L4 ^6 z( V       int count = 0;( T) P4 f) k( Y- Y
       for (int i = 0; i < word.length(); i++) {5 R; _# Q) U0 v
           for (int j = i + 1; j <= word.length(); j++) {
# D6 f  F! ?/ Q9 Y% B               count += containsAll(word.substring(i, j));% d) _& y# T4 {$ ~# R
          }
/ B6 o% W- I$ f) X- P  \      }0 F* ^) n5 b/ C2 o5 v* f
       return count;
! i! F: F! A  c- W) K+ Q* ~  }9 X# O9 P; M2 A+ U! A( W7 j. Y

+ ~) E+ F( ]: o+ A3 s6 ]7 `0 ?   private int containsAll(String s) {3 l# Y3 n4 [; {0 Q* h( K
       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {% @% B( Z0 j  @! S- e
           for (var c : s.toCharArray()) {
! _: |: P8 T/ Y4 |4 a6 Y               if (!"aeiou".contains(String.valueOf(c))) {+ r3 F, y) r7 W
                   return 0;
, r# ^$ v. N$ |  f$ [0 ?              }" _+ v+ {" j3 \; T8 m
          }3 s& z" u7 b/ O2 M% ]. G5 v
           return 1;! g, |) f$ X4 E3 \4 T' Q8 ?# |
      }
" P: y0 Y. z5 F+ O& f       return 0;# A: L* T7 M8 I
  }% J/ q* Y, X4 N" i5 E! f
}
/ [- L% F2 o5 n5 b! T- j7 N" L' U7 T" U3 K6 B3 Y- t
【 NO.2 所有子字符串中的元音】
4 I7 l: Z" o2 }( c3 R- @' E1 ]6 U/ H解题思路
7 l* o; c5 U7 u0 }5 j+ F依次计算每个位置的元音字符会被多少个子串计数即可。
: ~  o' Z( c! }6 }) b
  ~2 m& A; j( k2 k% B0 W6 n代码展示/ J# X+ l" g: k7 \

  v( U3 |- f0 p: p/ m3 A& nclass Solution {, C2 ]0 U0 B  g0 n# q7 y
   public long countVowels(String word) {8 j8 i5 a$ e& C% C: P9 f2 z. C
       long result = 0;! g# O0 ~. l5 U. Y7 q4 L! I
       for (int i = 0; i < word.length(); i++) {
7 k5 A. ~1 T5 ?" ?" r           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
3 @# U4 \  z0 @               continue;
2 N4 r9 A& @9 R& O' O! |          }
6 b) ]3 s( @2 Z0 A& z$ C           long left = i;
6 y7 _+ ^( {- u! U6 a           long right = word.length() - i - 1;
. [5 V) H; c$ N! m: R, p- N           result += left * right + left + right + 1;4 d/ @" j: }' W" s" H* o
      }6 P2 a  x& i% k9 k" e" l
       return result;0 `$ f* x2 l* P1 v5 U- s
  }
& l' }: m" a% X}
0 ^# U9 y2 p3 ^2 L( V
' i: _+ U! S$ ?* M( _/ K【 NO.3 分配给商店的最多商品的最小值】3 G* \9 W9 G& Q2 a! ?9 R
解题思路9 j! S" t5 I2 ?6 G! X: ]7 J
二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
7 s- [; @8 w5 c
- e6 w# c5 \) ~* u代码展示' F7 H  U  m6 p& f3 e4 O! s0 @
8 d2 ], E2 l! w7 Z
class Solution {
. |8 ^1 ~+ D) ?   public int minimizedMaximum(int n, int[] quantities) {* c% O" s2 W! u; o+ S) u
       int left = 1;( d1 u  G. d6 P: |! k! T/ O1 X
       int right = Arrays.stream(quantities).max().getAsInt();( o1 H: i4 w3 ]* Z
       while (left + 1 < right) {8 H) e5 b  Q9 R: z  p0 R$ o* A
           int mid = (left + right) / 2;$ r3 f/ _6 P: R( x/ q2 e- i  M
           if (check(n, quantities, mid)) {
& J0 l1 F; |1 N8 f. F7 ~* ~               right = mid;; o7 v4 `% X" B5 S  p1 T. Z/ ]
          } else {
/ Q: ]' x/ z& U7 U               left = mid;+ i% s. x3 _6 ]: y% N
          }: [  n! U" H, Q) u
      }
  O  b) c7 w& l4 V7 W. z       return check(n, quantities, left) ? left : right;
! M* R. ]* o% j' y% J5 b  }
0 v9 @' U1 v$ ^" u% z
: s, A3 ?$ |8 Y& ?" o8 o   private boolean check(int n, int[] quantities, int x) {
. E& {# G" {# j8 T8 t: p! g0 H       int cnt = 0;
" d; G7 S- [( X0 ?% ~0 b       for (int q : quantities) {
1 L. N9 t5 U/ ]- |           cnt += (q + x - 1) / x;2 A) q7 _$ M9 P0 F9 r2 W. L6 H  t0 W
      }/ n8 ]$ k$ G( y- t
       return cnt <= n;
! v$ G3 ~0 K( \! d9 @  }
; H" V2 Y7 W  \) C# m}
; J# |% a1 {& a% f) ]/ j
0 E2 S7 p7 x: t【 NO.4 最大化一张图中的路径价值】* x7 {- f) T0 `: h7 Z5 {
解题思路
9 h, ?. J6 w! `  b* z看似复杂,但是观察数据范围,发现直接回溯即可。3 A9 {. K0 z/ [  _6 w
/ H3 `) W% M3 y; W! H0 Y7 y9 q9 f# h$ S
代码展示
8 s1 G3 F" \. O
% F+ K/ ^# X- t' L/ q" jclass Solution {
7 m! Z. [4 z6 Y8 g7 C3 p- h" }   int result;' x) ?: ^0 s* D+ I$ U" N7 ~1 d
   List<Integer> empty = new ArrayList<>();6 H. v2 {  |: O
) R& s4 R, }  H" \$ V1 N5 Z
   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {# {- H) ^6 I2 ~: m
       Map<Integer, List<Integer>> children = new HashMap<>();3 y! D# P1 E7 t  e- F
       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();
* N$ d, a  A( j6 ]       for (int[] e : edges) {1 p- y; T7 p9 e; l4 m9 x2 Z3 F! s- ]
           if (!children.containsKey(e[0])) {
3 Q( i- u; z9 `8 c9 v               children.put(e[0], new ArrayList<>());
7 ~1 Z# Q! r! T: G2 A& B0 P4 R          }) d( g6 t3 x- q4 g
           if (!children.containsKey(e[1])) {( \/ H. V8 J3 b
               children.put(e[1], new ArrayList<>());# X1 j9 F6 N& S
          }2 I) r4 |. j' d* i
           if (!times.containsKey(e[0])) {
9 F4 ]4 A4 \3 y' Y' O               times.put(e[0], new HashMap<>());; v5 ~+ y: T& {- _! f: |9 ^
          }
. J# T" Q- g* W& R& `           if (!times.containsKey(e[1])) {
9 [7 ?1 S, r5 ~& q$ n               times.put(e[1], new HashMap<>());* }9 o' V- Z- v  S/ D' B- I& d
          }$ V' h* t9 w: ^1 ~& f/ Y  U% O
           children.get(e[0]).add(e[1]);
) J  m+ s( u, E2 U4 _+ l           children.get(e[1]).add(e[0]);+ X% x" [% o8 Z. r( `. c
           times.get(e[0]).put(e[1], e[2]);
  M$ S. W6 [8 q8 E+ A: W, ^1 Q           times.get(e[1]).put(e[0], e[2]);
& V. X* K8 S! A      }
( e0 m. A# b( N) V       int[] vis = new int[values.length];5 C+ p! p+ ?4 O2 D
       result = 0;4 g/ }9 P1 N* }4 N- R
       dfs(0, 0, 0, maxTime, vis, values, children, times);
5 {$ b, z% ^. \% @9 l* c1 f/ t) t       return result;
9 Q: D6 m" s0 A3 i) P8 ~. N  }: V" ?, v* S- z* m; o
  w* v' g$ x. Z7 {4 Z7 s) \
   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) {
  h+ B2 D% r: w1 ?( w* }7 p       if (vis[pos] == 0) {  C  k$ ^7 C3 j* M7 y2 \0 D
           sum += values[pos];/ ]4 @9 k8 O4 v& Q, W$ f
      }$ V) B$ F4 M! p% r, P0 k. ~
       vis[pos]++;
! p( W+ V  ?/ u* |! ~+ k       if (pos == 0) {2 v" w! j( n. a; Z
           result = Math.max(result, sum);
* q% w, M0 n. Z; p2 u9 w* T% d      }
1 g- I" D- I$ s4 C9 l9 Y       for (int nxt : children.getOrDefault(pos, empty)) {
3 B; @" }( [  C' x9 W           if (time + times.get(pos).get(nxt) <= maxTime) {
) _. U: I9 Q/ Q: K6 V; E               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);
' {, l! ~" l% |, B5 k9 f% D          }
3 e& p7 A& R+ [+ E- L* F      }; Y1 U1 w' Z3 O- \2 y) ~/ y9 Y
       vis[pos]--;& P( q, G5 H: D- ]1 a3 e, f
  }
2 L. @5 ^% L) f}
: k$ s* B9 \6 T' {/ k: b; o
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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