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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】
- p4 B' {5 a4 w3 Z& s& V解题思路# m4 _9 v0 y2 c9 [6 g2 |
签到题。) I6 o' U* g, N" }

3 t# p1 m& Z4 P/ |- E代码展示3 j  Y) R) r' X* k
6 L$ t4 _7 {$ m& E; M1 s0 v7 p8 d
class Solution {! K7 x; f% K, M5 l
   public int countVowelSubstrings(String word) {& \7 `- v& F# ~) {$ A9 p7 J
       int count = 0;8 S2 ~9 H6 K% ]
       for (int i = 0; i < word.length(); i++) {9 N" j. C: j6 ?4 b) p$ o
           for (int j = i + 1; j <= word.length(); j++) {8 F' T% r" w# }4 y2 t. K% ^$ g1 ?
               count += containsAll(word.substring(i, j));
* O  r/ F) X. A1 N          }6 S1 |- R! ^, D
      }
6 ^- G0 |* V* F6 X. r# _* l1 X       return count;
& _8 P" ]0 ^+ f  }
" d* ?; l5 F: G7 T7 \  S: c, q# Y" E6 ?  B) w
   private int containsAll(String s) {$ R$ @- S4 e) B# H- S
       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {) J# L: L3 d- [. @% m
           for (var c : s.toCharArray()) {
8 |+ X. m' a$ F: V" g               if (!"aeiou".contains(String.valueOf(c))) {
7 R6 w4 I1 b# }" w% z5 v0 g2 T                   return 0;- H! j" p' J; M3 f0 f  O
              }7 b% V) O# t  _) h( V6 q
          }
0 S% C6 r6 H- ^, m           return 1;& N0 j7 I& K2 A/ ^7 {- W
      }
3 @4 h& Z' S- e* N       return 0;& i3 w7 q  N# \. p4 Q# ?
  }
. ~" W* d$ k! d/ b' p5 }: p# ]" Q}& o- c& X: p: |6 q- U- J
8 m9 o- s& V7 K3 h- e. t
【 NO.2 所有子字符串中的元音】
1 ]6 S, g# ^3 |/ M, M解题思路. O' w0 i, H, m) ]+ h$ t
依次计算每个位置的元音字符会被多少个子串计数即可。
: I( |0 N9 }! d
& l0 H6 f' V' d5 D代码展示" C# `0 Q& i6 v  k0 D
, c- }% Y1 \! v  C& p
class Solution {% ]4 o$ l, M. i" k
   public long countVowels(String word) {4 k4 S9 m& b* J" [- D7 T
       long result = 0;. a0 p. a' N& p- E, ?3 E
       for (int i = 0; i < word.length(); i++) {
( Y- v, m, S' q7 }           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {; B5 s. r( \9 P* ]
               continue;5 b, E+ V3 F, g2 q# h; {
          }1 h2 x# Z, \% a6 k  t
           long left = i;1 _3 q! ]4 [: h
           long right = word.length() - i - 1;
* `, P" S9 {6 ?           result += left * right + left + right + 1;
4 j% o7 ~8 l! W1 K      }& K8 R. ?0 Z- M9 K/ |
       return result;5 V" C1 W9 z' M" U
  }
& c4 c: `' q! @# W, Y  w}4 ~1 w! N6 W+ g9 ~2 o

* M# P- V) }, K9 _8 Z【 NO.3 分配给商店的最多商品的最小值】( R4 c5 C# I" q# c1 u2 q: ]
解题思路
- e5 q4 m5 H, g9 c) l6 C二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。7 D3 `4 P$ l) A
% N4 ?3 c2 z- |7 W* q
代码展示- _2 y; L+ A; t' T' g: K$ k4 o: S& L) ^
" H" b' m/ J+ v9 G. N
class Solution {/ A4 l/ j" K* l& _$ d/ A5 G: w
   public int minimizedMaximum(int n, int[] quantities) {0 Q6 ^& g+ {% Y4 P1 z* N  P
       int left = 1;# `8 B$ v2 A) G
       int right = Arrays.stream(quantities).max().getAsInt();2 x3 H( B( b3 _$ |  B; @
       while (left + 1 < right) {: @' _9 M1 K3 f/ P+ Q
           int mid = (left + right) / 2;7 x/ s. b* v/ P) m. Z4 d. w
           if (check(n, quantities, mid)) {
0 H" X2 J  x  v4 k1 m7 O* C               right = mid;
1 ~2 G8 I* K( U4 Z% ]5 {          } else {3 I) h( z4 _4 L! J. A7 G+ ^
               left = mid;# P5 O+ b$ C# E
          }
5 y7 o* w+ Y7 f# n      }
# J9 g  H- c; ~8 U& Q       return check(n, quantities, left) ? left : right;
9 e- H8 N+ q: r* }$ l6 R; r( b" v& E$ o  }- k2 u9 ^7 |3 q1 B$ Z

2 b/ \/ t! w# H, F" d. y1 q   private boolean check(int n, int[] quantities, int x) {
6 d1 G$ Y7 G3 }' h* m* e6 k       int cnt = 0;' Z3 z5 u' l1 `2 a( n
       for (int q : quantities) {! [7 a0 {) x, r: F
           cnt += (q + x - 1) / x;
& w- `. j& m. b6 z      }
" z% X6 d0 P% q) X       return cnt <= n;4 r% n, F# N% g0 Q" s0 y
  }0 w" B4 \: w9 d8 u+ P" F
}% O( r1 A+ {9 ]" O# r5 e5 v
' Y( j* L; F3 \
【 NO.4 最大化一张图中的路径价值】/ v4 q* |) n: W% G( a
解题思路
9 |) ]9 G" o- b3 G. o看似复杂,但是观察数据范围,发现直接回溯即可。- Q, I7 d1 r0 q8 `, z3 {7 u

  X; k3 V; \9 ]6 p* r代码展示% P- L1 c5 N3 l% T% {- d3 q
, f) \  x6 ~( W7 d# L! i8 W$ H. f
class Solution {' N* [  K5 g! L" Q8 o& L9 L
   int result;
% P4 Z$ q# Y- }   List<Integer> empty = new ArrayList<>();
+ S7 z. a% z, i: d. ~$ W8 F; J/ T7 B( I) v' H  n' {. R4 q. L: i( ?
   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {
* T) e) b# \9 W' E5 \4 D) f: M       Map<Integer, List<Integer>> children = new HashMap<>();
, @/ X% R; n3 {4 V$ {3 d       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();$ u) Z6 t3 Y$ m5 m4 k( \1 k- p, V/ T
       for (int[] e : edges) {
4 d- y* _/ X" r; x8 M0 R  z           if (!children.containsKey(e[0])) {5 @- m1 J/ d/ \$ N- N* B
               children.put(e[0], new ArrayList<>());: G: \8 d- w& ~) n& F' N
          }0 N  ~; [# V( n
           if (!children.containsKey(e[1])) {
+ K* W$ {- a( f: I               children.put(e[1], new ArrayList<>());2 I2 w% u5 y" J/ F
          }
2 `$ g( F" }& l% ?( W- z           if (!times.containsKey(e[0])) {9 D, M, f/ y4 Z  M- S
               times.put(e[0], new HashMap<>());3 T! A9 x1 K7 y) V& r) {( z; `
          }1 j  q1 y: I: f
           if (!times.containsKey(e[1])) {8 g$ Y1 p: g0 @. O+ V( |
               times.put(e[1], new HashMap<>());
( m* ]3 p* I& x4 f6 a; j          }0 S. w5 U3 \$ ~+ y& a
           children.get(e[0]).add(e[1]);, E1 b3 x/ ^  q2 [$ o
           children.get(e[1]).add(e[0]);
' Q2 x& E! N4 V1 i% Z- K; j           times.get(e[0]).put(e[1], e[2]);* I3 x5 a! w( D( Q
           times.get(e[1]).put(e[0], e[2]);9 P- E! V, l& s5 p$ n
      }
: m! y9 ]+ w: K3 K8 k       int[] vis = new int[values.length];4 }1 _" X( z2 q: v. Y% @
       result = 0;& `4 g0 T$ p3 A  e' d  @
       dfs(0, 0, 0, maxTime, vis, values, children, times);
; F" o$ n# ]7 u1 G& ~; n       return result;
! o# }' F" U" [# u: m$ o, \8 K  }
% z9 Q" D) f& L2 r7 X2 m
$ `/ U+ g% T# a& K& x   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) {
' D4 o) M7 |' [7 Z% [       if (vis[pos] == 0) {
/ Y# d4 r3 H0 i9 c, }: C! L$ m           sum += values[pos];
1 I# O5 ^7 i* T1 \      }2 D- o* \& p2 u& D  y. n
       vis[pos]++;
8 o) d/ R+ U! S6 A5 B5 e, a& v1 w; ?       if (pos == 0) {
: M; J+ j6 x7 ?2 \. V) [           result = Math.max(result, sum);
3 \$ z$ Z# N/ g/ P. C) E( F- Z      }. E5 I' R5 }5 R, \; G- N, Z
       for (int nxt : children.getOrDefault(pos, empty)) {9 A4 v7 ]7 k: O2 l6 T
           if (time + times.get(pos).get(nxt) <= maxTime) {
9 @. f1 M1 w3 M' I- }: t+ @5 T  Y               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);* [9 S: G& _7 F$ D0 h7 ^
          }" K( M' S4 W- \. j0 j
      }
$ r9 R2 M+ K+ A' p, z9 a       vis[pos]--;
6 g. G$ l" C8 p2 _! D$ x  }
; p* b: l; `6 y& o. d}
2 Y' W" {, A  h, D
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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