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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】
4 B4 l* _6 u6 J0 c解题思路
( h" s  N# R* m签到题。& Z! \6 i& C7 n5 ]

; t4 i1 r( z, v+ p* X代码展示& e8 z( R5 g5 w6 e

# s: F9 y$ u  h3 y7 `class Solution {
$ O! o: R' j/ u$ x5 N   public int countVowelSubstrings(String word) {# d5 t% I0 A; L  T5 e/ Q
       int count = 0;  q& o1 c2 f* Q. I- q4 K+ ]# k5 a
       for (int i = 0; i < word.length(); i++) {' T0 B$ r$ g' D# k
           for (int j = i + 1; j <= word.length(); j++) {
5 @. x5 ~9 z$ Z9 N% [( ?               count += containsAll(word.substring(i, j));$ s$ _( y; K( r) t, `# U
          }
; E9 `) l6 y  b' D3 l9 @# g      }6 `& q& r# o7 Z: p* ?% }
       return count;7 i# {$ h+ K  E" C- R2 ^$ b
  }
( Q$ N# I" H! J( w& d1 \  u  [6 _$ e, W3 x/ U, l# [; e4 u' r
   private int containsAll(String s) {- Z' W& t# z1 }" A
       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {
+ p% }$ D1 e. \7 j7 j7 g& N           for (var c : s.toCharArray()) {
6 }' h9 Y; U* R6 Z& j( I               if (!"aeiou".contains(String.valueOf(c))) {- _( z/ {3 I, u9 N3 P  }
                   return 0;  q" ?2 ~: t! z+ e$ c
              }( G0 v% d5 V* w/ \. M
          }/ u' U8 A3 g: ^  w2 u% B, d/ p
           return 1;/ t& K' b) J# M7 X# m" w
      }* b$ x6 e; S& |4 A
       return 0;
* V& s7 }: R3 E5 I  }$ W3 R5 |) l% ^" x! S* }  b* {
}# {' P% C8 O# t! \/ \+ b/ l
9 f, V, t% {$ @4 r  f6 F
【 NO.2 所有子字符串中的元音】
) X) M* \& \4 C3 K/ i+ X, o! @解题思路
. o7 i  o0 O% r依次计算每个位置的元音字符会被多少个子串计数即可。* T( n5 Z* a; c' p+ |4 e
* t( O- q( p' d2 F. m, o5 g
代码展示; v4 l6 e8 W, x  m  Z' E; ^& w9 I
/ v; @! [2 C. ^. C7 r+ m
class Solution {: A& c, v2 k$ }4 d/ O# d8 Q. r; ^
   public long countVowels(String word) {
: L* ~/ G- N/ a! ]; h       long result = 0;' u" x. d2 K# K
       for (int i = 0; i < word.length(); i++) {. @  L4 D' W% B+ R, r  a
           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
7 M* e; z2 H3 i2 z- [               continue;
8 g$ Z6 k1 u( c9 S  I0 L          }; ~  G& Q! X  q/ q
           long left = i;. t2 }2 j: [. g+ t) t: V
           long right = word.length() - i - 1;
8 l+ z' Z% n* l3 L           result += left * right + left + right + 1;+ N2 V- h8 y! Y8 A  f
      }  W* |" |; E! T6 f+ n/ J0 N
       return result;5 J: K, l! g7 {' x% m1 E2 P
  }5 v) [; |6 z, y5 W6 Z) O' ^+ f8 z/ h
}3 f8 Y# \" i# B8 X
+ G: X& r2 }6 N' b1 r
【 NO.3 分配给商店的最多商品的最小值】
! _( ~! x3 ?. A  x- t5 O解题思路# K, ^6 P% z. C6 Y# d
二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
( o. S: A7 o" m1 S' G* n/ j4 T
3 K2 ~7 S! v* W& ~7 l代码展示
6 R' v8 [! ^" ?
7 J" i$ Z7 {, o) |class Solution {
# O, W; q7 c( i; J0 V   public int minimizedMaximum(int n, int[] quantities) {. V0 ]# s9 r* U: B- \) s
       int left = 1;  b! `# t: W3 s/ B& o6 _
       int right = Arrays.stream(quantities).max().getAsInt();/ L! y6 V. l9 C
       while (left + 1 < right) {/ Q2 C6 l( w+ L7 c0 D
           int mid = (left + right) / 2;
3 H5 A1 R! F+ x, K1 o- o           if (check(n, quantities, mid)) {; x, f2 Q" R" N; }: e- L, k) n" B
               right = mid;
2 O* E, r. ?/ n' c4 `+ g/ x- R          } else {6 H% h: v2 S' H  T/ F
               left = mid;
  e" l. `7 o& S! ?: L: N( p6 j          }9 \7 ]" n. _4 K/ M0 t  n
      }
, L9 C, [& y: T) Z       return check(n, quantities, left) ? left : right;6 o- |7 N; v, e3 Q; U
  }& u9 w* W/ t6 ?  G: m4 q" p

  B$ J9 E  W$ R* A4 h   private boolean check(int n, int[] quantities, int x) {4 p4 a# Y3 c6 ^
       int cnt = 0;! b- e( `- K. g. e
       for (int q : quantities) {5 K5 G: B+ x1 m! h, j+ s# v
           cnt += (q + x - 1) / x;) ^" H4 T7 t1 F$ j$ M8 M  b+ c
      }
* F% @- y8 C; Y! ?" f6 V! ~" ]* g! C       return cnt <= n;
% @4 b' O8 M3 y, B; o  }1 X7 f" b( A9 s3 D3 J
}
# f; ~* b0 t( B7 ~* x; F- J5 ?- b) h% g. ~; a
【 NO.4 最大化一张图中的路径价值】# w5 k5 D0 {% {0 U8 H
解题思路3 M; i4 O& Y. q  u' Q8 ?/ f; H/ M, A
看似复杂,但是观察数据范围,发现直接回溯即可。1 O% s6 S/ J' R
' \6 M/ t3 c8 e# m
代码展示7 B2 {7 c0 |; I& U+ U. \

  e* z4 k8 c/ kclass Solution {
7 Z$ S& B' u+ F$ Y$ }$ E/ a' r+ I   int result;
2 X2 t% ?5 c6 ^& A% ?* c; I) m; z2 B1 r   List<Integer> empty = new ArrayList<>();
0 N  ~9 |5 Z# b# s" x4 Y; b7 B. ?! I. W
   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {
2 i# H4 U# _% v4 k       Map<Integer, List<Integer>> children = new HashMap<>();. R) T8 D5 @& s% m# ^
       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();6 q8 D% G( T5 N2 s7 d% i* S4 `
       for (int[] e : edges) {' D8 `9 t7 I4 V& x. f
           if (!children.containsKey(e[0])) {
# j8 A$ y" m7 ^+ w; l               children.put(e[0], new ArrayList<>());
* @# h: ]5 o( J" S  q! I          }' i  i: a! g/ o( {. d% Z
           if (!children.containsKey(e[1])) {  k7 t+ J1 h# \. j& K! a
               children.put(e[1], new ArrayList<>());
' f% r+ `# s: {  j7 ~1 V          }
2 G6 |; q: ~+ Y6 u) F           if (!times.containsKey(e[0])) {
/ N, I; E" X& a               times.put(e[0], new HashMap<>());. y. ?& m7 i6 R# X3 q
          }+ h# l2 l" F4 X* Y# [5 w" A. _- `
           if (!times.containsKey(e[1])) {
+ C0 A4 p- I5 Q* j* i/ O* @' f               times.put(e[1], new HashMap<>());9 }( K1 u: E1 Y9 l8 L, K( D
          }3 I, I) a" \/ H: a2 ]
           children.get(e[0]).add(e[1]);
% T. M8 i( Z/ w  F- L           children.get(e[1]).add(e[0]);
5 J/ Q5 e6 Y0 @4 c! _9 Y           times.get(e[0]).put(e[1], e[2]);8 o7 v' @1 @: r: S, |
           times.get(e[1]).put(e[0], e[2]);
# b, H% h5 v( d) t6 H# n$ Y      }
5 H1 [2 g* C$ Z+ a7 I+ [       int[] vis = new int[values.length];' R5 R1 B, }* g4 e) E
       result = 0;
0 k  k/ z' R) [- B; U/ }       dfs(0, 0, 0, maxTime, vis, values, children, times);' @  Y6 Q* `# a: z9 C7 n* W
       return result;
3 P& Y7 K* I' i8 Z# }/ A2 e2 @  }0 \% ]4 ^+ X' C3 l' h* G: C
" v9 ~* r2 c5 T% ?- d7 |! v# 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) {4 n& `' r* l/ P* C$ V
       if (vis[pos] == 0) {& P/ f" g7 r/ I/ ~# i6 P1 i
           sum += values[pos];
( \% d8 ~" g# A% o6 {      }
& H9 `+ K, ]$ |0 B2 m       vis[pos]++;
4 U0 A) G" A- Y# G' A0 U       if (pos == 0) {8 D" K& d+ R4 {" D. @
           result = Math.max(result, sum);3 P/ @. S8 B  Q
      }
: ~4 w8 V# M8 E" w. F  e       for (int nxt : children.getOrDefault(pos, empty)) {# p& G5 ?7 P: e2 E
           if (time + times.get(pos).get(nxt) <= maxTime) {
# Z7 p! [- A) K7 ^5 ~+ F# B! p+ D               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);3 l0 S, q/ ?# G# y; b  e% Q% A/ s
          }
. V2 ~+ p2 \$ G+ C; o      }4 x1 x: v& p# D9 t4 p
       vis[pos]--;% f; z3 f' k, j/ I$ f- p2 f1 p
  }
7 |5 j' C  Q7 j0 y2 y, ^+ l}. g4 v. L/ y$ \& K) ^
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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