登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计字符串中的元音子字符串】
! G4 ?. w# l& l7 h2 _( a解题思路
3 H" o! ^# [, w) M& N签到题。8 E9 m) k; F5 S4 l
% p1 |0 [: ^# t& Y% q
代码展示5 H4 }! A5 s. q
3 a M0 h0 ]# P8 B9 ?
class Solution {0 n0 ]" H) Y1 d& H% B4 o* y
public int countVowelSubstrings(String word) {5 Q; ]4 B) o+ i. i \4 e
int count = 0;0 X8 u, C! l* D0 a% o
for (int i = 0; i < word.length(); i++) {
' B& B/ {2 e0 ? T: z- x3 B5 c: v7 W for (int j = i + 1; j <= word.length(); j++) {
$ J7 v& C# m4 [+ G, [* d5 X1 ^ count += containsAll(word.substring(i, j));- w+ t8 @ ^; T- I( Z- g
}& S1 N0 K1 A$ W. I& {' X6 ?
}
8 r, c$ E! p' P- U, S return count;
/ a4 l0 T8 u+ F- J2 _* O5 Y }) s1 u' D, R& e" e; m
6 I) j! E' x! s: ] private int containsAll(String s) {7 j# W# {/ h: T2 s6 l8 i+ j0 T
if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {) D; s; p% {& M( j& L+ S# N. D
for (var c : s.toCharArray()) {: v( ?2 b/ V6 [
if (!"aeiou".contains(String.valueOf(c))) {( s' r$ E6 C8 u
return 0;6 L6 ]& [2 c9 N' _) a w
}
5 M4 h" o+ d0 \* l: S }
1 A5 W2 p1 u6 z- }5 D return 1;- v6 J* K8 A2 C% Q( \% n
}
. U- a7 D# c# B: C" Z return 0;
1 Y( \& e+ O! Q6 a& @' P( \$ A8 N. q }
% P; i' J* G, D3 T}* |3 a( ~2 n o) i( x
% X& e$ d& {9 B z0 C【 NO.2 所有子字符串中的元音】
* G+ c0 K- @# E' g# F5 K解题思路
& O4 k" D. A7 A k4 {: r, k8 Y依次计算每个位置的元音字符会被多少个子串计数即可。
b: h: w( Y( P9 E- o
& e0 U0 }8 {; p代码展示5 y" m$ l+ l1 s4 G, N7 b. a4 R
$ B7 O- Z- h% a
class Solution {4 L7 \5 G6 G- V7 {& D* s L7 k5 f
public long countVowels(String word) {' q2 V7 j4 ^3 K8 [
long result = 0;
& L7 m) ?" u. E/ C for (int i = 0; i < word.length(); i++) {; ^: C$ r& I# h
if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
! ?# F* x1 h. B, M) `! F continue;2 ]3 m6 `: c# u$ M, o$ [/ I( ?: e
}6 Z3 }7 D) F5 a: b9 K2 l$ e
long left = i;/ U+ \+ b3 \! {( J4 e( U
long right = word.length() - i - 1;
7 t1 d% H% O. z S; h+ p9 u! c result += left * right + left + right + 1;( ]: c, y' @0 X' m
}4 Z/ L2 o) `* x X+ O, {
return result;
6 m; E1 N4 c& M8 I- X }
7 a9 I/ e j; L Z; L}! y; G c4 O0 _: r
. B. w5 E3 {. b/ v9 h* \3 d: l
【 NO.3 分配给商店的最多商品的最小值】
8 f) A) {) W* f/ i7 x+ `解题思路
1 p8 l) N* E! |二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
+ d; f% u/ I5 f8 V0 M. C: t( [: p% `( N0 c
代码展示" L# x$ m( a$ B% Z) ]
! U }6 W& ?6 i& W7 Q# _
class Solution {
# H5 p9 Q- n3 f3 E public int minimizedMaximum(int n, int[] quantities) {
) D0 c3 U- o: S) n' n9 I/ t int left = 1;
$ `* k0 |& Y4 ^6 [ int right = Arrays.stream(quantities).max().getAsInt();$ }9 p7 T& m8 e% {
while (left + 1 < right) {
8 X, C8 N/ k3 R1 K/ P$ W9 O2 `1 ~- @ int mid = (left + right) / 2;* @+ T4 z) P# f# `' \, O) b
if (check(n, quantities, mid)) {- h8 d, Z1 A% G6 n; k# { g, x _6 u
right = mid;& q7 i& l5 L- b3 x* }* [8 R$ Q( W
} else {; K: Q* W3 T7 g7 ^3 W' s, N4 c
left = mid;
, x. e' P3 a5 z: n }- a2 p: `0 S7 F
}7 Q/ w8 u' _) v9 U, |1 r
return check(n, quantities, left) ? left : right;
2 d$ a8 U3 h/ Z) r; Q% }5 i }' b' u8 s* T( {' Y
: X; U% A' R9 g private boolean check(int n, int[] quantities, int x) {2 F$ K7 h8 W' K1 b( C
int cnt = 0;) ~+ ]$ l/ ^2 p* Q4 V* Y7 J8 u
for (int q : quantities) {
6 D B6 m5 g. w9 W- C cnt += (q + x - 1) / x;
# d- n1 B7 `" q( [ }! j q+ S% n" p7 ?- o. N
return cnt <= n;
: q! N7 I$ K7 V) J- H2 G+ v1 ^ }7 l! r/ S8 T+ `6 }
}
- c6 ^, ~+ s- z3 b! h
3 n+ r9 E; S; y% F3 @3 M9 P【 NO.4 最大化一张图中的路径价值】$ S4 x4 e3 r3 [1 }; i
解题思路
6 y; D- Q$ S1 J看似复杂,但是观察数据范围,发现直接回溯即可。2 }+ L" t2 I1 t. U9 S
7 e7 ~, C' ^% @% L; X
代码展示
- H! M( m( }+ k/ e( X0 S: b$ ?9 ?# y% g/ x3 w+ ?- s% N9 t
class Solution {
2 _2 e+ g+ ]& Z7 O7 c int result;' C' Q- k- A8 c) ~
List<Integer> empty = new ArrayList<>();6 q9 G; `9 u9 y# }$ W7 G, N9 o
, r0 ]/ _, d$ P0 z* U
public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {
5 w4 z8 X$ a- E# e) B Map<Integer, List<Integer>> children = new HashMap<>();
4 d, Q e) W" | Map<Integer, Map<Integer, Integer>> times = new HashMap<>();9 T9 A6 H3 I% l! E" f
for (int[] e : edges) {
' p! {: ^8 v& ?9 x if (!children.containsKey(e[0])) {2 R4 r4 \0 p% p. y* e
children.put(e[0], new ArrayList<>());! l0 f* C- `: n4 o" G
}
0 P; Y/ n( _8 d9 {& c* {) ]6 G if (!children.containsKey(e[1])) {" K' J- D2 Y/ a, T$ P
children.put(e[1], new ArrayList<>());
: ~9 _" |: H" ]/ Z* Z8 Q }9 C6 b3 ?* Q+ A$ q4 ~
if (!times.containsKey(e[0])) {
# H8 k- }1 D. P times.put(e[0], new HashMap<>());% \; B A% {3 X/ C
}* {5 d7 d5 C" y( P- i& h
if (!times.containsKey(e[1])) {! K9 [, ^7 Y' t
times.put(e[1], new HashMap<>());
* ^: H7 t+ v+ ^2 z }7 K, y8 m8 t* {4 ]6 s
children.get(e[0]).add(e[1]);
1 k# ~& C }# u4 w8 ?$ c8 Q* G children.get(e[1]).add(e[0]);
- Y6 M6 P! i: l3 p8 b times.get(e[0]).put(e[1], e[2]);4 s: n0 ~& S- W6 ?
times.get(e[1]).put(e[0], e[2]);, h* \4 ~# W6 R
}
4 O1 p9 @) i3 W/ X0 z int[] vis = new int[values.length];
( Y% w b6 [6 b/ W& ~7 ?4 h result = 0;
3 a& q; O. Y7 {4 O* k; A3 e dfs(0, 0, 0, maxTime, vis, values, children, times);
; Z0 d5 c; A& ?& V& w) j9 n9 i return result;
- F. o8 b# T/ q) F3 U& f$ I }* i3 [. @# M. m0 P$ s, Z
0 i+ q# Q9 _3 Q A 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) {) ]8 m/ {" d( q0 x8 L2 n- g& W
if (vis[pos] == 0) {
+ u( L+ W' j) n: h" ~& \( b sum += values[pos]; ^% r. c% ` }/ l
}0 W/ U* O2 l# ?1 ~
vis[pos]++;4 M4 V' @2 M& X9 k1 [
if (pos == 0) {- v- W$ d5 k+ [- f/ j$ U
result = Math.max(result, sum);
. J: O; D; S0 f# R3 e }
o2 d! v3 u. d" z$ m for (int nxt : children.getOrDefault(pos, empty)) {4 W. x% W) M% @9 T1 T
if (time + times.get(pos).get(nxt) <= maxTime) {
6 ^( t1 j7 b7 O$ @ dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);
! v! p4 Q/ q$ h7 T }
3 K: ~1 z$ K; [9 t* N }
3 m& K+ o, l" z& u2 X vis[pos]--;) ]- R7 ]. a( u# ?( p" y6 b
}3 [* h3 m2 r9 c% E$ V
}
* d: G0 d# e. T: o6 O R |