登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计字符串中的元音子字符串】
0 t! _3 b, e: R& q; T; T解题思路" `6 ^% }) L D7 i3 m
签到题。3 @$ w7 I; J9 s: L
4 m6 G$ _! Y/ S8 k+ W- R代码展示: t$ F# |2 ]* O3 A% X# m) _
7 m( w! C$ K; aclass Solution {, }& N3 o6 A' u& H3 X0 {3 Z# x" ~
public int countVowelSubstrings(String word) {
" K! K+ W' E2 ^3 P. T# T% Y int count = 0;
9 Q6 K& @ [# o; a for (int i = 0; i < word.length(); i++) {
4 P& C7 h( v, s for (int j = i + 1; j <= word.length(); j++) {0 C' [7 D8 Q6 V6 Z* I8 c
count += containsAll(word.substring(i, j));6 r& t! w+ b; U% p5 v
}9 Q' f8 ]0 E" A3 W2 \
}
) P1 e; \; Y" g return count;
6 a6 e' \0 u0 f q* ? }
" H. H0 V: R5 f, [" s$ G& t: N+ l0 J" k' J9 i+ K4 A# C) g7 K/ _
private int containsAll(String s) {
( l3 C: R( C2 i/ X if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {& g/ x+ y+ S* J) w" k% O
for (var c : s.toCharArray()) {
- R; t# J( U3 K7 U3 Z# ]. g# g! c# f if (!"aeiou".contains(String.valueOf(c))) {
( B: _* m! I' @9 {& [6 N return 0;3 G% r/ x, Q3 E) r1 B6 ~
}
- |; i1 l( p6 \0 }2 k }( k; \' B: g& t' t& d
return 1;5 c/ l' i+ a& G- ?' ^
}
; W! } ^; ?* `, s) \ return 0;
9 P' c! S8 z( }4 r% ~& g/ ]0 C }
" n2 W5 e$ w/ N6 n8 M7 ]( q f) v$ f}
5 P O: Q% a Z3 H
; \! Z5 D( M+ W8 [* ^【 NO.2 所有子字符串中的元音】9 k' _$ r3 S, _: K7 `
解题思路
1 ~, W6 `# D% I5 y依次计算每个位置的元音字符会被多少个子串计数即可。
7 k! K' ]4 t( r4 f9 ^8 f" ~5 o! X- O% ^8 i" {9 g( s5 P
代码展示
: T3 g/ ^' V3 P1 f; I* F+ L- A- H5 i, x V
class Solution {( }* i" g5 d! |& }4 l* p7 C3 G
public long countVowels(String word) {
! ?4 _. I# y. g) H% n/ p6 L long result = 0;
5 ^) d9 l$ C# w5 d: S; V for (int i = 0; i < word.length(); i++) {: Y' s# o% o8 R# Y# c: k2 S
if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
2 j# K1 [3 F6 c5 }2 h6 M& v continue;
) A8 K/ f$ [& D }( I7 k* P$ I5 z( ~
long left = i;
, i( b( v( i7 N) f) Z: K( V long right = word.length() - i - 1;
5 H* G$ n) a* i" G0 s2 s result += left * right + left + right + 1;
- U3 g! J# A4 G3 c8 Y }
7 h# E$ g% g2 n( @% C' r- k return result;3 u( N0 q, G% h5 w; I1 ]2 d& i7 x
}/ M% I0 `, P" Y% _+ z# Z, j
}
* X: q6 k- U! g. {7 ` Z( S9 s( l- n3 l1 W# ^. E
【 NO.3 分配给商店的最多商品的最小值】
9 Z8 \( _0 U: }2 @) `8 h( u解题思路
& t. [+ R1 v3 i) _二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
' }- S4 Q4 `7 y6 }* p
% \. j9 W3 [" B( R代码展示
5 J: h$ ~# s2 f, x2 \ Z
; D6 D* j+ Q8 }class Solution {
0 a& r- j' T+ U8 f# j; s public int minimizedMaximum(int n, int[] quantities) {
; K7 W" y& Y5 p* ^& J% R7 } int left = 1;
* n, C8 E# _; q+ H" Z int right = Arrays.stream(quantities).max().getAsInt();4 |6 ~8 t1 i( d
while (left + 1 < right) {
V2 N' w2 _5 _ int mid = (left + right) / 2;
; z6 U% Q6 z: B4 j- R3 e if (check(n, quantities, mid)) {
4 c; | L) \. H4 A5 R right = mid;
( [$ s# L4 H7 C* Z" v3 v } else {) D- k0 r* F D: a4 X: d
left = mid;
4 s& s/ I3 J0 R- p" j% a3 g/ ? }
% {# X! x6 k* G }
. K k5 P8 R' B; s Y' M return check(n, quantities, left) ? left : right;
) n2 y7 w" z4 H2 n6 d9 Q& a }$ e5 R) F6 P7 m8 A( q3 G* S, J2 u
& ]# I) ?3 o; `) E& _# M2 S, y
private boolean check(int n, int[] quantities, int x) {2 Y# d4 h4 K8 x+ O4 `3 K
int cnt = 0;
" @' k- b1 y U/ N! B6 H9 R for (int q : quantities) {7 {& O3 }. p$ D1 a' Z8 c
cnt += (q + x - 1) / x;; B L+ H" i8 ?2 P( I4 R1 j
}
% g3 ^' a% F" M- F- U' V7 V9 T return cnt <= n;
( q2 R, c) z8 j3 c }
0 B% f, \4 a& ^' P# H: Y8 t: E5 R}# p: V b8 h$ x# @ A* u6 G
1 x! a" y+ n# ^【 NO.4 最大化一张图中的路径价值】" c3 U& o7 ]) H
解题思路4 a! C# H& B& P0 [7 y
看似复杂,但是观察数据范围,发现直接回溯即可。5 y6 x Y9 |' A5 ]7 y
5 K. K! v, J/ m6 x3 j& a6 Z% s
代码展示
# q- u: ?4 q; A: J
# `) x% H4 U( s2 c' [+ Sclass Solution {
$ s" H& E) @/ u1 Q3 _3 F, Y int result;
2 F" @) Q* h3 W) f List<Integer> empty = new ArrayList<>();7 d* @$ n3 H1 _4 D. W! a
' p. [ H. l( F2 p2 i* F
public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {+ U5 ~1 l; |4 [6 c4 h$ q, I6 X
Map<Integer, List<Integer>> children = new HashMap<>();
$ R/ R9 U: M8 X Map<Integer, Map<Integer, Integer>> times = new HashMap<>();* E3 K6 o+ i6 S4 }: v
for (int[] e : edges) {
) w3 P/ h, k$ ^% L# n if (!children.containsKey(e[0])) {6 U8 [" `; r1 B+ X
children.put(e[0], new ArrayList<>());
7 z0 H* o9 M( ~+ O3 f+ h& j& B }
, o I: r5 q5 r7 b4 g/ J if (!children.containsKey(e[1])) {1 z7 u* t0 B+ M% z
children.put(e[1], new ArrayList<>());2 Z Q+ H: a y" z8 F% J% X
}
1 j) }- L1 S% R5 y9 l. U. c if (!times.containsKey(e[0])) {
$ y# V1 ~' B# X9 N/ r# t times.put(e[0], new HashMap<>());
) X, o. O* I" H- H }0 E8 M; t- ~# q% E
if (!times.containsKey(e[1])) {
, d$ {) x9 J- w times.put(e[1], new HashMap<>());
: R& I5 Z! Z) W" f! t }
9 S1 G! P! w+ c9 K) p7 O% M# b! U/ S children.get(e[0]).add(e[1]);; @. K) r- \2 W% R& B& a4 w
children.get(e[1]).add(e[0]);8 X9 {- z" x: F- ]/ n6 R' o
times.get(e[0]).put(e[1], e[2]);
0 H% H( n' O. s" ]% @ times.get(e[1]).put(e[0], e[2]);
( J$ o; L; V7 Z- |2 s% J# A0 q+ J }! a" S7 T7 b6 p! ~
int[] vis = new int[values.length];) u% g/ o8 {% a. E- V0 a# N
result = 0;; _: D* W- G2 h1 _# H2 Y5 b5 t
dfs(0, 0, 0, maxTime, vis, values, children, times);3 n( F m/ ~. J) e' i9 t4 }
return result;$ H+ p% c( H' Q1 V( @
}
& [% g6 H+ A; W2 }
7 e- a' ?! n n% 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) {
6 l1 k8 p( s0 b* P( o( \5 p if (vis[pos] == 0) {
6 f5 E% e+ ?! ]5 n sum += values[pos];3 F% g( x: t% B w; H
}
. G# G) ] Q* b vis[pos]++;: u8 B5 Q, e6 t4 b) X
if (pos == 0) {( _% C' `0 n% }$ s3 s+ s
result = Math.max(result, sum);
" P# e Y3 H( S+ n6 j }' ~# c! T2 P! H: _9 x
for (int nxt : children.getOrDefault(pos, empty)) {
4 }5 H: q' B8 _% x. ] if (time + times.get(pos).get(nxt) <= maxTime) {
# @1 K7 O' V) ?# k dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);* T+ T3 Y$ Q* T; w1 z w8 a8 [
}
' a3 ], V4 a' Q } F2 i+ {0 V8 a& m2 y; Z0 }, A
vis[pos]--;
$ g- i. r' Z2 G P6 X {6 G+ i }
" k' |/ v; s/ }; D {8 X6 N}; {4 u8 q) R' j* x
|