登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 值相等的最小索引】 M: W* N7 ]* w
解题思路; u0 X: r; e9 v& L; I2 t9 a. p
签到题。' r. h* D( s, I4 ]. M. y
3 E$ Q0 x0 E4 T7 J" T+ O3 O# Y( M代码展示" ]. b: j1 s: |
* X4 b& ~( ?7 {$ d- _9 aclass Solution {
8 Y1 l. a( W: @. T* ` public int smallestEqual(int[] nums) {
/ K! D+ S6 s: I for (int i = 0; i < nums.length; i++) {8 X0 \; I3 t7 t7 [6 `( \
if (i % 10 == nums[i]) {4 R" A* z" t2 l. K. q
return i;; w& w0 `3 j4 x( G) S9 u' P
}+ Y x4 h/ V L6 k: N# U# t6 F0 @9 n# @
}
" P0 e) y7 H) S( N% S8 c return -1;& J# \2 @7 P) V" |% s8 i
}
# g5 U; s# k2 D# y3 Q}
2 z- T$ i1 U9 j, x4 Z4 c
" | _7 w# }' H# Y. d0 K9 P; h【 NO.2 找出临界点之间的最小和最大距离】# H" k& y# D9 q+ C! h: d
解题思路$ z% F- R& F' s3 A5 Q' y" M
遍历链表即可。
2 J, B; ?% N& v
5 \: S; a) I; W$ T l代码展示
/ I: a1 B# r6 c: Q1 I; {0 x3 G$ S( ?4 X: [+ O8 l' B2 b
class Solution {
6 U$ `5 t6 n) \. k public int[] nodesBetweenCriticalPoints(ListNode head) {! ^6 U+ x+ L: ^5 ]3 t& D
if (head.next == null) {2 f1 f. t- }$ W' b; H
return new int[]{-1, -1};
- j' {0 n+ j1 Y! h& \ \ }
4 f$ r9 M" b' Q6 j7 o, A6 ~ List<Integer> pos = new ArrayList<>();
7 R& S0 x* I3 a# T R8 T* f int last = head.val;6 u5 i6 C2 m$ f A8 ~* j
int p = 1;
2 I/ J, E8 j/ l; E/ r( ^2 u8 p for (ListNode i = head.next; i.next != null; i = i.next) {" H. H1 ^+ l, b" D
if (last < i.val && i.next.val < i.val) {
' M; }1 Q, V( I) W% b pos.add(p);1 b3 t5 u/ U; P5 {( q
} else if (i.val < last && i.val < i.next.val) {
! C( I6 B* I* r pos.add(p);3 Y- x j+ E. [9 Q
}$ a$ ]+ ?) ^6 g
last = i.val;; g' k1 v: h( k% r' l
p++;
3 |* d0 E3 n: x; ?4 L6 X4 `3 `3 V }8 P8 e$ ^2 p4 Y- m' Y9 ~
if (pos.size() < 2) {
% W \' A3 F4 Q& `( ^/ Q' ? return new int[]{-1, -1};
6 ~7 V9 A0 j7 D$ y- u t }. n7 P* Q+ M6 b/ { c
int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};
/ A' @! G- K0 i+ ^' B) w for (int i = 2; i < pos.size(); i++) {: T6 a+ _( y( F( y0 ^- J5 {) C( ]2 E
int dis = pos.get(i) - pos.get(i - 1);+ c8 i w; l! ?9 [$ Y" ?/ v
res[0] = Math.min(res[0], dis);
- K0 T1 l0 f& g* o0 I; p }
5 @! ?! x# M! B! O* T return res;0 N% B. @1 X1 r w) y" o% D) n9 I
}
4 ^3 Q6 C: B* O3 s) o}5 Q) P! |% P7 k+ W: e
. l/ _ F0 m" f5 g
【 NO.3 转化数字的最小运算数】+ V0 a$ X X& `$ P
解题思路8 I/ F& J+ [* M* |& l5 Z( Q$ q4 i: D% J
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。
: r; p$ f( r' l$ @
6 l) y5 J. Z+ z因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。- x1 m5 p& u8 X; e7 N+ v6 K
. L+ K7 X( c- D代码展示6 e: X+ W+ }* y+ D3 _5 V: x' G; ]& z# W
; D( ~" M" I0 j$ D& W4 Dclass Solution {
' T+ W& D$ Y ? public int minimumOperations(int[] nums, int start, int goal) {
6 x" ~8 t$ N0 S8 ^; i int[] min = new int[2001];
# m. W2 @ W0 C Arrays.fill(min, 0x7fffffff);, e* P- d8 O. N; x! \
min[start + 1000] = 0;) {; s7 z1 B; _" `$ e% p
LinkedList<Integer> queue = new LinkedList<>();
) j H8 T% t' ~% S5 f, F queue.add(start);
# {" ~8 f8 b9 I% G$ N while (!queue.isEmpty()) {
0 N' O) x/ O) |3 I6 p4 Y4 f- F( a int cur = queue.poll();5 `0 y6 y9 Z) j$ D7 K' L
int dis = min[cur + 1000] + 1;
2 v) X1 s7 O& P! \4 f9 v' Q U for (int i : nums) {
+ Z# \& `) K: d1 A9 U( x0 A" x; ` int nxt = cur + i;% X: l H2 ~1 N' u6 M
if (nxt == goal) {; {3 y% l4 I( Y c/ f
return dis;
+ s h4 k8 }5 F9 t2 P0 g( n } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {* m k4 p0 V N9 h8 n
min[nxt + 1000] = dis;/ u" }, A: m) a, N
queue.add(nxt);* j+ x5 _7 i- ^( G$ S
}, a' {" W* l. H/ v. r
}% c0 e2 h: f& X& x% Y# w
for (int i : nums) {( U! D2 W c0 g- F6 ?0 T \
int nxt = cur - i;
4 o, A( A: v8 F" a: z; s# R if (nxt == goal) {+ F/ r1 {; _7 j1 `$ k/ {
return dis;' `+ N( @, e7 n" {4 V- ?
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {: R/ ~( c- Y4 c2 j. {. k$ r
min[nxt + 1000] = dis;
9 ]5 h% C9 I4 l7 K queue.add(nxt);
$ V* H- a: X8 q5 E) C& n }
" F0 n' X, Z3 q# @$ c7 i% E }
- ~1 v! Q8 M! X for (int i : nums) {
7 t6 u+ T" M2 u0 M int nxt = cur ^ i;
, G/ l$ D% z$ r/ i& d+ K/ Q* y if (nxt == goal) {3 p& F- U4 ]1 v& x
return dis;6 Z% H6 P, q5 S! O9 l$ O
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
9 X# [- o* S' H min[nxt + 1000] = dis;; g' [, W: A$ F6 d" Z7 |- | ~ T" Y
queue.add(nxt);1 o+ _3 {' n$ C1 P# U- V y6 F
}2 ~, w" X0 X) a" T7 o& T# e3 Z+ O
}
; w3 e7 _8 x; z* s4 u } q: L& }; |% d
return -1;
. Z( h2 K& B0 I+ m) x% X0 W }) b6 B/ j" \* `" y/ f& j
}6 O3 w4 O; F7 `
`3 a& T! |+ x0 [【 NO.4 同源字符串检测】2 H# Z8 S; Z- P4 I0 g0 t
解题思路0 ] \0 r) u% Z
动态规划,细节见注释。: R+ c1 V z. Y
: M3 j! p6 K' X; a) h V4 l代码展示
3 P' Z( g7 d+ F ~
6 O5 R0 k, E6 x _class Solution {, Y0 X* T; A8 f- D
public boolean possiblyEquals(String s1, String s2) {8 G W2 b w: v7 y/ i* k' B
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差" w+ M& O5 {: o' J/ P
Set<Integer>[][] f = new Set[41][41];
* [7 j B3 A6 o: F for (int i = 0; i <= 40; i++) {
# T; G- b. d+ e2 x for (int j = 0; j <= 40; j++) {
" v$ \8 ~) P6 P4 k2 s/ L9 s6 \ f[i][j] = new HashSet<>();+ I: T" }+ z5 p
}
- t q1 p+ V% u8 g5 Z8 r* i z% F }: F' A* n4 a9 g; N2 P
int n = s1.length();3 c* K5 A" v( v
int m = s2.length();; V. N, N- ^% E3 l
f[0][0].add(0); // 初始化 f[0][0] = {0}
( H0 a3 z; {* A$ v for (int i = 0; i <= n; i++) {* C6 C3 z% `" v% x% h' d
for (int j = 0; j <= m; j++) {0 c2 F5 S6 Y5 A8 M% O( L
for (Integer diff : f[i][j]) {5 d) w3 s% @; d: C, F
// 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉& _# O, R2 l1 t0 \5 L9 R
if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) { q% b9 B8 r* Y! y1 z' N
f[i + 1][j].add(diff + 1);) z }7 A% _; N9 ?
}
8 q% t( h7 B% H! K1 _ // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
! @' `1 e7 d' G% c i if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
0 y2 c9 i9 G) O2 J O f[i][j + 1].add(diff - 1);. P- H* Q) e+ V
}
3 [% t$ f. k7 p# @ // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)/ X9 D7 K! Z5 e+ a
if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {5 d5 H: h" T c7 B& M; z
f[i + 1][j + 1].add(0);) H3 v+ W( t4 W
}
6 V0 L% x1 I! b // 枚举 s1[i:] 的数字,加入到集合中; X6 O T6 \9 B
for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
9 v& T0 Q- N- v; F4 r6 e4 |; u p = p * 10 + (s1.charAt(o) - '0');
+ u4 b% v1 [% v7 a f[o + 1][j].add(diff + p);
) v7 q# q% V% m" C" C6 ]6 C }
) q: {6 D: b U& z. |5 f0 w$ Y* T // 枚举 s2[j:] 的数字,加入到集合中
$ d9 z3 h" S( P' d for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {+ ^0 X F, e) f! ?
p = p * 10 + (s2.charAt(o) - '0');( A `. K( U( N* T v
f[i][o + 1].add(diff - p);
b) q, K+ h5 s6 N% J1 d }. h* @5 J; I3 H
}/ k# H# j- ?. \6 \: ?, C, p' U
}
. L1 m+ e. p! Y/ g) t- }) T8 ~' P& Y }
, Q4 _! j6 ~ l% t: r) P# c+ s$ I return f[n][m].contains(0);
# J. b9 O- D; r! \. ?9 y5 k/ ~ }
' Y: n6 [8 S3 c# `' s+ h}" b3 `- H1 P c1 t* i& V3 M- @
|