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