登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 值相等的最小索引】
1 c% T5 k, \! d2 e解题思路: k) F! B8 l4 P" U9 Y& W$ ?
签到题。
6 O! z7 K; \4 W4 a& K
* {7 w% y7 @/ e7 h5 Y代码展示
! [; T: i; O8 M* t# W6 q7 H1 @3 A: W/ @; ^8 w
class Solution {
/ _9 N; y1 A4 x8 ^# O public int smallestEqual(int[] nums) {
3 l7 v4 R: b2 U4 r" Z7 {* @% F for (int i = 0; i < nums.length; i++) {
5 v" Y4 k) @( W# h if (i % 10 == nums[i]) {
/ l' p$ \) Z- v' V: y$ k- m2 m return i;
) `- V4 m3 [; a2 `1 \# N }* Z" ], @$ Q2 `+ z2 X6 U
}. L" Y' W/ C3 t; g( V
return -1;
1 M0 z& F Q( R }3 |) M) D( C0 S3 U: I( L* y2 t
}
: u3 d" I/ Y, m! [* Z9 f
: ~0 G- ~5 X9 H6 F: R& F【 NO.2 找出临界点之间的最小和最大距离】$ I, [# D2 u! J% t2 T5 V
解题思路
. a$ B# S) A5 h$ t' ?% G6 J遍历链表即可。
$ v% `! _- N5 K1 r1 Y% R' [4 q: Y9 w6 x. l2 }8 U
代码展示7 e) a" O& B$ L5 p2 R4 m, s$ [
, Z( t8 r9 y1 w2 K9 \. Q7 _% Oclass Solution {& q* q1 q$ c2 ~
public int[] nodesBetweenCriticalPoints(ListNode head) {: A: a9 X0 D' q
if (head.next == null) {- h x4 U: \ b8 {% ]! p
return new int[]{-1, -1};
' s( q) Z' [6 a& G7 ~( N6 A! j }
( N" d8 ]' U# W& P& E' c List<Integer> pos = new ArrayList<>();" x5 P" u7 T8 ]' K' @1 t; G* `
int last = head.val;0 r; ~4 X1 K- c: N
int p = 1;- z' \" V, S. E8 X S4 D) _! i
for (ListNode i = head.next; i.next != null; i = i.next) {+ o# Z% b& L2 D6 @+ a- q
if (last < i.val && i.next.val < i.val) {
9 m$ C; c0 e( S' K8 F8 u pos.add(p);. _9 h& s {" F# [
} else if (i.val < last && i.val < i.next.val) {) K4 Z$ @% l* o1 O% r
pos.add(p);# o$ o, k4 i+ x5 y5 S+ f: i* P
}
) [. f: M4 l1 o8 F5 F8 t last = i.val;2 K, E9 g# O; ]9 [* S# v' h
p++;0 ?, h8 \* S* g! D4 T4 ]
}$ L: M% S4 t1 Z. h! M
if (pos.size() < 2) {! e' ^- j" ^# M0 |# w! u
return new int[]{-1, -1};
7 w; e1 A1 ~ @6 v }
. y! E; J! |% y5 M, S% O int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};( f2 n# n5 |6 G3 r( u* n1 @1 j0 a
for (int i = 2; i < pos.size(); i++) {
1 `) q" T9 U" Y8 z" n int dis = pos.get(i) - pos.get(i - 1);
& m0 a+ p( K- s. x0 [ res[0] = Math.min(res[0], dis);- ]" y/ j2 d8 @: ]
}3 f, n/ P5 g( F# g+ n. g- U- Z
return res;
; I% X, N7 N; _7 G7 l' Y }8 v+ e8 N( k; J8 ^( C
}
" r) J/ x7 {, W* J* v7 B! |7 N% N9 a
【 NO.3 转化数字的最小运算数】+ }" I8 p) e! q
解题思路/ j! M) Y/ V# J& y
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。
7 z# W" L8 d+ _: N' A0 |9 _: [2 @9 I ?4 ?0 ? Q
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。/ E5 P6 t* g' |9 ~( l" v# z+ p" b
3 d) x/ m+ G* }1 `, S% I* M: L/ J( N代码展示( N7 Z0 U" j0 z( k: X- [
$ K9 B& q- F7 u5 D u- N
class Solution {
- ?) o7 @; G7 J% ^- r" s9 }2 _ public int minimumOperations(int[] nums, int start, int goal) {
/ `6 L9 s* Q, m+ c' T int[] min = new int[2001];. Q. V- ~: g7 F. Q" f" f
Arrays.fill(min, 0x7fffffff);
# @/ @. C1 k% ^* c/ z4 D min[start + 1000] = 0;! _' Y1 v5 j3 d
LinkedList<Integer> queue = new LinkedList<>();
4 ]8 T" ]+ b2 i5 a2 Q6 |: X0 Z0 W queue.add(start);- n' t4 v+ `# f$ T* q" Y# B
while (!queue.isEmpty()) {3 j! Q) p" C7 G7 s2 a
int cur = queue.poll(); P( k% a" l$ G/ u
int dis = min[cur + 1000] + 1;
7 Z! b: D% u/ w& s$ g/ | for (int i : nums) {
: i, I# h3 L- @, [7 y2 A& G- H int nxt = cur + i; `9 H7 |/ O) t3 ^2 x
if (nxt == goal) {" |3 w. a2 ^5 H3 W. d! ]1 Q4 v
return dis;
$ j! }1 q2 k! ]9 M } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
7 h" j* Z" M" F min[nxt + 1000] = dis;
4 G7 M# `8 |* H% Q: t: [ queue.add(nxt);; L8 @$ f( r% {4 q1 c$ ~0 A
}
1 {4 e# a2 t) I ~, {! q% R) p: L }
7 d* o/ m* Y" N% J6 J for (int i : nums) {
' l- f: f% [$ @* y, w, n9 P int nxt = cur - i;. }, p+ |& {5 B; }) X, p3 @& l
if (nxt == goal) {0 I% w' L7 q6 x( j. d8 B
return dis;6 e5 l* R$ n8 o E( r+ v
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
5 u9 \0 W1 Q4 h& K7 x) }$ h, k min[nxt + 1000] = dis;) i4 v! Q* M$ G+ t
queue.add(nxt);
5 S2 j- B; Q! } }
1 h" E* G, H( ] }
1 P/ E9 K. L% g- I% j for (int i : nums) {
8 k3 |3 D# i9 B# {4 ?1 g int nxt = cur ^ i;( ?- J8 r6 R7 I6 K; }: j
if (nxt == goal) {
9 a/ u9 c. S% f. X7 _) x( V; J return dis;
& A9 i# n4 @( b( |( p& ~ } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
% }% s; `3 g! D min[nxt + 1000] = dis;# h$ W* M+ B p$ V3 L; {! n
queue.add(nxt);
! _- C# Q1 X j$ t9 U0 M$ H }3 V, e% r' [/ r
}
, ^' C( L; e w0 q1 i# @/ y" O' l- j }$ j5 T% R6 Q& P, e6 N2 m
return -1;2 a7 H, v4 n; K! ^
}
; c0 h; v( H; x( Q}
3 m) z2 x' ^* v& c C( n( l& p5 A, h) g6 }3 a* P7 J% ], i% f( F; z+ W# c
【 NO.4 同源字符串检测】% P; f: V A0 W# [
解题思路
/ L. r2 E; w0 H' o: m) n/ Q动态规划,细节见注释。
7 Q }, ~9 q6 j, n2 n$ M* O" g; R$ m- i, V6 c5 Z: p, a- y
代码展示
% D; N6 v# `$ E! S
- `& c$ O# j, ?. Pclass Solution {
l0 ?- C1 d: ]# E3 y \$ G0 @$ r public boolean possiblyEquals(String s1, String s2) {2 P6 T' K: M3 c" f7 G: E+ v0 W5 q: N
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
7 E! n3 @8 m8 c9 H3 q! [) r0 h Set<Integer>[][] f = new Set[41][41];
- H4 J0 b: B- ]9 ?1 B for (int i = 0; i <= 40; i++) {
3 d: w$ G; R; V' y! `# t$ d for (int j = 0; j <= 40; j++) {% R- x- d. O e( o
f[i][j] = new HashSet<>();' G4 u" D) X' g: X! k$ X
}2 f( Z) x r- g2 r% U# @8 k0 f8 D: d
}7 R' X% g( \: K; ?
int n = s1.length();
- ] t% v1 j* ?2 h s: b int m = s2.length();7 L* X6 e: V4 @; S/ Z, g7 b2 g5 G
f[0][0].add(0); // 初始化 f[0][0] = {0}
6 k8 H- @& S' y: ] K- X( S for (int i = 0; i <= n; i++) {7 n8 ?- Y ~0 R6 I, u
for (int j = 0; j <= m; j++) {! F4 ?7 q, z! @$ S
for (Integer diff : f[i][j]) {
1 R2 Q% o/ v W. j9 N7 c% c // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉, l, G0 k/ ]9 y
if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {
# O# S9 [: a# D: p* ~* C f[i + 1][j].add(diff + 1);
P+ C% ?) @3 g! P' O+ d" t }
! G; e; i, V! L // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉% M9 e. { s- v$ Z1 b- t
if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
5 Q% [) H! q# ^/ \+ u f[i][j + 1].add(diff - 1);& S: ~9 t3 b1 K0 R8 N0 x
}/ ?/ k8 Z8 O& F3 c
// 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
& g) A! K9 S# Y% y4 w if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {
) E5 B( p7 t7 R! x4 @ f[i + 1][j + 1].add(0);
: n' T; f: @9 \# W- M }
e# I$ }( p+ V' x0 n5 j; } // 枚举 s1[i:] 的数字,加入到集合中$ v: F( g0 X _
for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {8 {4 @1 |1 m% X5 m- o
p = p * 10 + (s1.charAt(o) - '0');6 e" k) a4 K" k2 b: R$ M( x
f[o + 1][j].add(diff + p);
* T. S3 e+ A' Y: `: l) _1 A5 i7 K }. d5 b/ \! u- ]9 [7 c- x/ }; C2 ?
// 枚举 s2[j:] 的数字,加入到集合中0 j, N3 z$ p8 m& I
for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {
: W% e& ~+ m& ^ p = p * 10 + (s2.charAt(o) - '0');5 _+ l% C+ m0 F7 _5 G
f[i][o + 1].add(diff - p);, d7 h+ G9 o; D; F" s- O+ G% }
}( c7 f3 C- q, J: h7 o
}& Q4 w# }6 W- B3 F% |3 U5 J
}) o9 j+ h9 F/ S9 T g0 ?
}+ V. s0 V% f, G& f4 U
return f[n][m].contains(0);
3 ~7 U: P1 K, v2 q4 D( e }7 h3 \9 M& F' y @8 ^$ N
}
! p1 r! z/ k. c* R% Y$ S |