登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 值相等的最小索引】
1 i. }( j' }2 U解题思路+ h, l) `7 @6 K! T3 s# Y: t- J
签到题。' R7 |' o8 I6 u" @4 j( ]
$ b" }/ L: S) L8 U8 H! @. W; G
代码展示# n' D' n5 K+ j8 D3 Z
5 n' G# L9 U0 F
class Solution {
' Q' h1 l' m0 C+ q7 T" V9 U" p s public int smallestEqual(int[] nums) {; @. g8 W# W' }9 C- M x% K
for (int i = 0; i < nums.length; i++) {% L6 d3 B2 c; T% n( |7 |
if (i % 10 == nums[i]) {! t! u" s; n( V$ l
return i;
! O6 o1 h* Z M) a }6 p I. D, G# E# z
}% n! M. Q, E2 U1 \" ]1 z# W
return -1;
2 I I) U( P) Q }
% l+ |: y% z. ^: V5 x}3 I5 q5 E; P7 Q1 ?$ g
' ]% _( a# `7 n+ A8 Z【 NO.2 找出临界点之间的最小和最大距离】
; M" h3 H- e4 b$ ?7 u' i4 a b解题思路4 Z( G) C2 L5 A9 S0 r2 x/ _! E
遍历链表即可。: _, `% y. O) _" d; ?
. B' ^9 v2 y/ @/ u( {4 ^6 w7 k. |1 G代码展示
! {1 k7 M/ Z8 a1 }2 d; s9 C, ]6 B$ U5 P7 X) q
class Solution {
; `$ C. m1 r' g- e; C# m9 r public int[] nodesBetweenCriticalPoints(ListNode head) {
- U( H8 L, b5 }' R% j' v% T) r, r if (head.next == null) {
& |( I; M# g# j, ~; ? return new int[]{-1, -1};
" t3 u" P; Y: M T- ` }
# ?+ G/ {( u$ [9 h$ F List<Integer> pos = new ArrayList<>();
o3 ?) k6 t/ _( R int last = head.val;8 ~$ l/ t2 T- E4 `' r3 S! u; U
int p = 1;
* j' E4 G0 R! i' N for (ListNode i = head.next; i.next != null; i = i.next) {7 n# _0 |# t6 A' d& ~
if (last < i.val && i.next.val < i.val) {- u0 u% P" a7 D3 ]+ D8 f5 x1 H8 V
pos.add(p);
2 e* f- }! M! O6 C( P6 J } else if (i.val < last && i.val < i.next.val) {! G- o, O, J9 f" X$ p' t, w
pos.add(p);
+ `3 F" M2 M3 H# R- p* S* H8 g4 y }: o6 _. @+ _/ g1 e5 i6 e( H3 m
last = i.val;
) t- x- A! a- L* j* _ p++;
6 L1 k' p. Z7 C/ G }
9 h5 q* p( e1 J' T( U. J9 O if (pos.size() < 2) {9 x: i& M7 s7 B6 z3 F# F
return new int[]{-1, -1};9 w+ O2 Z+ P4 P# y. i# U
}
, w/ `1 b' g; P1 A9 X) L- A; e; V int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};
1 g( O& U% u* ~0 z+ I9 @, t for (int i = 2; i < pos.size(); i++) {
5 m$ L) g* Y( c int dis = pos.get(i) - pos.get(i - 1);* z) l4 w8 d% K' L
res[0] = Math.min(res[0], dis);
% ` [6 o# g& ~9 i6 v }; q* n1 Q4 f$ b
return res;' e3 ^# b8 j( X
}
) M6 x; F- T7 `& F$ j}, w4 ^5 L& q/ X* x8 B- O
/ v! @* C& D$ h8 f; ^& ] N+ M l【 NO.3 转化数字的最小运算数】
6 p* b0 a0 d; X g. U/ K解题思路! x2 q5 D5 [ b" v$ T, m4 I
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。" `0 j% X/ ?9 A# P# l
. j& W$ Q: W8 s
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
: m7 D( K y$ g4 X% n
& X" b: _9 w+ d( _$ }5 Q* l- P代码展示
8 L: C7 i5 R2 ?& e- K; x5 R" h$ ~4 o/ |& A+ X
class Solution { d! M+ V# L$ K3 b3 |$ s+ H
public int minimumOperations(int[] nums, int start, int goal) {
% ]$ k! @+ i' S8 \2 { int[] min = new int[2001];2 K9 }% l/ K: k; r( t" Z$ F
Arrays.fill(min, 0x7fffffff);
) @1 V/ C) S1 a( a) c& m min[start + 1000] = 0;) K5 R" @" @) ]3 S% n2 i
LinkedList<Integer> queue = new LinkedList<>();
' N; ]! }# X* d, d1 u queue.add(start);
- K6 z! }2 H: ?2 h+ M while (!queue.isEmpty()) { S/ p+ V b: \: ?3 a1 G
int cur = queue.poll();
: o7 H0 Y2 w. i4 {: c, V' X' Y int dis = min[cur + 1000] + 1;' _# @6 r: s1 R+ s* [0 s& a$ u
for (int i : nums) {
9 U+ f2 f. F2 Y ^ int nxt = cur + i;
. i: a* {: m6 {# Q1 v) R if (nxt == goal) {( x! z* @7 N1 R4 q2 S9 p
return dis;3 m; d* x e9 u! e
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {! H, r6 N) r5 N3 Q6 o# S: ]9 T% k5 C
min[nxt + 1000] = dis;
( ^: \: O) `! q5 ^: ? queue.add(nxt);! p4 V. z! A9 C6 D
}8 w: ]% ~6 K! c: Q* G* W3 A0 p0 T
}
) F+ w& l' m( A9 [ for (int i : nums) {" \- C2 n- {; U4 Y
int nxt = cur - i;- g& p0 Z& A' `# t
if (nxt == goal) {# b% H1 G: A, l/ ~3 }% {
return dis;0 `+ S5 [. S1 Z W; m
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
: H: v8 b( o( \2 `$ A min[nxt + 1000] = dis;
- C5 @8 o' n/ {+ i queue.add(nxt);) L# R" F' ~8 z, Y% n
}
# p( E! f6 j2 q }
( L7 t, y( ~4 z' @. J# M& { for (int i : nums) {" p) o( G* k- _8 V6 e+ P' S! ^
int nxt = cur ^ i;0 i4 M6 \5 ^% U/ v
if (nxt == goal) {
n' V8 \% H& M% a+ ?* v return dis;" y9 n7 W7 Q. X( [* ]& n% t1 r
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
, ?" H- n! r) p6 ` d# Z7 T2 g min[nxt + 1000] = dis;# `2 ~0 R8 |" X
queue.add(nxt);% S; Y: |- K& }' G
}
2 g- N: V- s1 d/ G. Y. j, f }
' q' x9 e2 T1 _$ @& M }8 x% }# ?3 ?3 d8 D' ]
return -1;+ ]) j1 u0 k5 q( r' o2 H- s
}9 @$ R9 q" U- a; |8 d/ p4 W" X% N
}2 a3 R- `5 [7 U; i- _4 C: w$ B
) G7 t; D( s/ n0 {0 b: C$ N+ r. H3 z8 {【 NO.4 同源字符串检测】9 g b8 H; O" i3 i7 W$ H: S
解题思路
8 H2 l$ [# Q, d x9 N" Z: A8 D动态规划,细节见注释。
b2 x/ G$ P7 `. b+ l/ {
2 w2 b9 ?" j# A4 V$ f1 Z2 H$ C+ a代码展示
7 }# @/ P3 l8 g1 {, \2 [ S7 V) I6 L& M, [6 C8 `
class Solution {
% O% R# V7 T3 G0 ^ public boolean possiblyEquals(String s1, String s2) {1 k9 F z1 r# D/ @
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
+ {$ b! b/ P" m5 Z- a Set<Integer>[][] f = new Set[41][41];
+ v S+ t, S# T for (int i = 0; i <= 40; i++) {
. `! D4 u5 x' } for (int j = 0; j <= 40; j++) {
8 L' g1 `9 ~ O# ~9 V0 g f[i][j] = new HashSet<>();3 k. u2 x/ i8 A3 L
}
3 |& c: _& b: z; S8 a+ O% J$ } }
2 P, O0 P9 h8 Z+ o' R; v int n = s1.length();; v7 W8 l6 O! L
int m = s2.length();2 r) J! q, d; r0 _1 m, H9 }- K
f[0][0].add(0); // 初始化 f[0][0] = {0}
( m& P1 {* g G6 O! p; c. ` for (int i = 0; i <= n; i++) {
& b0 q# [( o: N0 m) ~ for (int j = 0; j <= m; j++) {
2 s0 a/ r8 ~$ D5 {; g R7 z9 i for (Integer diff : f[i][j]) {
1 t# X1 A) V/ A. ?9 U1 j; v // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
4 P5 ~6 q# i# @/ T5 N1 q! o if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {+ @4 g8 `/ Q- ?% i
f[i + 1][j].add(diff + 1);4 [. \8 r2 a* E) h* {* F5 P+ A1 n$ C
}
9 Y! V9 d( I- q# Q9 G1 I" C4 A8 Q // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
8 y3 ?" m, L0 [! _* V! y0 H. \5 _ if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
& l1 C8 y4 @ s+ |* ~ f[i][j + 1].add(diff - 1);
9 B1 W W$ {4 V3 z$ a) G% L4 g8 ~ }
; l q! A7 n# | L8 P // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
* o. n. x! g# [% H8 J if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {
0 e' W# ?! a8 Q- t- L" Y* H' O) r f[i + 1][j + 1].add(0);, o5 A9 Z* \* T+ w; M# P
}4 Z* V: a+ v) W& x- t
// 枚举 s1[i:] 的数字,加入到集合中* ^# ^ }$ ^; x) c) j- U
for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {( q5 K8 t- o6 B/ |5 V$ x3 m
p = p * 10 + (s1.charAt(o) - '0');* A# `$ ]8 s2 M8 e9 U( B" q4 |
f[o + 1][j].add(diff + p);5 u# P4 {1 G% I
}
* ~ e2 y8 K1 L3 v+ `3 m: [ // 枚举 s2[j:] 的数字,加入到集合中5 z6 z+ U3 q) u0 i% |+ F
for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {
' l6 I" A5 h* n5 c2 R* g0 W p = p * 10 + (s2.charAt(o) - '0');
4 B$ u! f2 L' q$ F) `; M f[i][o + 1].add(diff - p);5 `. ?6 R. @6 ~/ t* z2 z/ n
}- ?9 Q. a, e' \ o* H
}
; O) ~3 x! T% a8 ~5 ~% @2 u1 p }
; k4 y& [: K, d3 c4 R5 I1 v5 q0 R5 _ }! t+ v6 ~3 |3 G" s+ {
return f[n][m].contains(0);; s1 Y! h5 v" E% x
}
( c0 Q( z. p! \6 i}( R2 c; C8 D: ?4 ^# r
|