登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
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 |