登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 值相等的最小索引】
/ ~( d( t) f9 `. N% U: h解题思路
, v F E; K+ F* l签到题。1 y9 K& U5 L4 u/ l+ R3 J
' O) t/ I7 _/ j( T p代码展示
/ e' S' b# Q, F# i
! n" Y9 f, [( H6 T4 |% r, M( _class Solution {
# T+ Q" H4 g$ B8 d+ o public int smallestEqual(int[] nums) {
0 r& R2 ~: z& M U% f for (int i = 0; i < nums.length; i++) {1 \2 v1 d4 b' P; }. T8 k4 V
if (i % 10 == nums[i]) {
" L5 N+ g1 n- }3 f/ k return i;. q' m3 K- b9 {% _4 _) ]
}, F/ N6 l$ M- \5 k/ S" f: p
}
9 A* l7 r( K. c. s8 Q" I+ h return -1;& o; s% P9 c, q' V; ?! E" c. W4 e
}
0 _: F& f- z# V}
. v) {- `1 Y o* p8 b
7 {" Y" a1 a: S1 Y6 s0 S【 NO.2 找出临界点之间的最小和最大距离】7 y: K3 L7 b3 \) ?
解题思路& f# \- }' m* D4 s: K: G g
遍历链表即可。0 f' v( B; H/ z, g) p8 Z
' W2 i; B& i X* h
代码展示
8 l7 P. f: Q8 T
$ B- I- m' b+ W: k. z' S0 pclass Solution {
3 O: I% r c) N- ? public int[] nodesBetweenCriticalPoints(ListNode head) {
; s8 e% B& ^4 V4 G% c if (head.next == null) {3 j% X- Q g# p/ _6 j
return new int[]{-1, -1};' i2 V+ H9 G, _* }4 P8 ~
}
( K! W- d4 e! ~' {6 p: ~ List<Integer> pos = new ArrayList<>();
) N& e0 [: o( u, |/ y! M- A int last = head.val;: k B# e- b3 H# m/ |' p
int p = 1;
% E$ c5 J& F- J2 g. C for (ListNode i = head.next; i.next != null; i = i.next) {
! a/ \# }9 j1 Z1 P) q4 ~# ^; A3 d# h, A if (last < i.val && i.next.val < i.val) {
# Z0 ~" Q$ I8 R7 U7 ?, ` pos.add(p);/ V& K R8 W' s# S2 W
} else if (i.val < last && i.val < i.next.val) {
) Z+ G6 I6 `' d6 J pos.add(p);/ x, F9 j! Q( D
}1 S( Z2 Y6 K' R3 W% ~8 B
last = i.val;( ^# o* i8 |5 T1 ]2 q
p++;
+ }: E' |2 M' s4 F- o- X; O* G }
$ ^& M& z7 g4 k: N8 M5 \# L( A( o if (pos.size() < 2) {0 D& }3 a* v( f3 o0 f f
return new int[]{-1, -1};8 h' C/ }9 p+ @# ]2 x
}
( x$ K' v$ p7 C int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};; S% L+ g6 X. D* c$ S
for (int i = 2; i < pos.size(); i++) {5 z( h& D+ C1 f5 ^0 ^# @4 _' W
int dis = pos.get(i) - pos.get(i - 1);) ~1 J4 s% w7 L- Q
res[0] = Math.min(res[0], dis);
- \8 N, M; O, }' Z+ H }5 M B, D* l8 [9 ]
return res; Y3 ]- R, ?& |* s( U+ ^
}
' d, G# j- u% t; F/ L5 k} y6 ^/ D: O9 a1 |/ l) N6 M
3 M+ ~5 H/ ^5 L& W【 NO.3 转化数字的最小运算数】
+ _5 w0 ~, R" k$ t6 }解题思路
# ?2 U4 I1 a/ R) j2 C相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。0 I( F7 ?0 H5 e9 ]' K3 q( ?- j9 B4 m: k
- I* t1 b% n6 o. @! w& B
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
) b- N3 D1 K/ M3 q) O3 b% |# h, y
7 M/ q2 ~- v- I. s代码展示
' m% t+ g9 ~2 F2 j- U+ d% _+ `) _/ u9 V/ w9 h
class Solution {# H6 ]$ K( }4 z4 c
public int minimumOperations(int[] nums, int start, int goal) {5 o4 \8 ], U/ e+ O
int[] min = new int[2001];
' Z8 u: E* E! x' { Arrays.fill(min, 0x7fffffff);* w2 b6 j$ Y3 _2 H' W# G4 q
min[start + 1000] = 0;
{+ l5 i- I) [& D% ?' v LinkedList<Integer> queue = new LinkedList<>();
! S) e; J) X B: s* R( ] queue.add(start);
- G) I5 z; e/ `6 i+ w8 b" [ while (!queue.isEmpty()) {: l. i3 K$ S( S% V. x9 b2 ]( W
int cur = queue.poll();7 i0 k( R$ k! ~: x* X3 f2 }- ^( }
int dis = min[cur + 1000] + 1;
3 u; ^/ F* }0 |/ S2 r for (int i : nums) {
& v4 K u1 i# z) E8 H% f int nxt = cur + i;( u$ Z8 r1 h: c2 _1 a3 I/ q3 H
if (nxt == goal) {* b- }* q7 v8 P+ m. Z! V! e w) t
return dis;; Q3 f( a3 d( T$ O3 g3 v+ I
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) r. G/ C2 P$ r1 P
min[nxt + 1000] = dis;/ V, q7 i" E, w) e) z. N
queue.add(nxt);
! n3 Z2 h8 }3 r5 Z. t } a8 ?. d& V& k. |3 u
}& y$ m' u. b2 U6 C
for (int i : nums) {
$ e l3 ?; @ ?5 T2 m. z int nxt = cur - i;. M& I9 Y) T& F$ l# p- i( v1 k
if (nxt == goal) {+ s0 r" ~, k) c% q3 ~" D
return dis;) \4 l( D$ t' `4 C; W
} else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) N8 ]+ [5 Z! J
min[nxt + 1000] = dis;: f& K# \! R9 P/ s% B8 S
queue.add(nxt);
. Z8 M7 d @) k9 H; A1 Q0 i }9 c% k8 K" D* o/ g3 J9 ~. v
}
( U: s4 U' A8 J. D/ G7 W) m0 A for (int i : nums) {, a1 x) i P i+ f' l" M
int nxt = cur ^ i;6 R; X N) s; H7 B% j. e
if (nxt == goal) {
8 U$ T! @. T$ C r return dis;
! D; u5 _+ `/ H7 E1 o } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) U k6 H; k! k6 s) o5 x
min[nxt + 1000] = dis;
4 `$ i# h0 n, S# ?, N queue.add(nxt);4 l* `$ ]' M9 s7 @: {3 \- W9 a
}6 E2 l8 k+ w7 M4 b
}; G5 h2 a7 ?$ [0 l+ V! z
}- x. U+ R' R4 h
return -1;# M: V* n, d2 @7 n' }" M
}
h* \8 [- U# h6 k1 \8 @4 k8 c}
7 c2 U7 G, f4 q# X3 d1 `+ a5 U. E9 D" \ x& r' P
【 NO.4 同源字符串检测】 T" i% C! F% Y; F& \# P
解题思路
- `. D K3 c) k# r4 l+ p0 f动态规划,细节见注释。
! L5 U( z& c F+ y% l' ~$ h$ o/ k7 G% r7 D% p3 T
代码展示8 u; U4 T0 e8 z( ^! n% M
/ m0 e$ ~9 _& mclass Solution {$ P ^* X* [6 E* V3 M0 ]# K6 K0 r
public boolean possiblyEquals(String s1, String s2) {3 I* i/ D; H* `. Z" d: P! a
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差1 J/ `9 ]* N' J ~7 J, E3 u
Set<Integer>[][] f = new Set[41][41];8 e9 q1 N2 f* l& j
for (int i = 0; i <= 40; i++) {
3 r: s% V8 C0 z0 M/ ~) j for (int j = 0; j <= 40; j++) {6 Z+ K6 M. } Y, S& O, S% A
f[i][j] = new HashSet<>();/ n4 c$ A! A7 T' B& Z0 A
}4 Z3 y. [' O$ {
}+ ]) ?& |4 y* N! h- d# v
int n = s1.length();
6 S: `' L( n' x- T& V0 ` int m = s2.length();4 S$ N+ G3 J9 K$ z
f[0][0].add(0); // 初始化 f[0][0] = {0}
- ^3 V+ Z. b" N b% E0 g5 V for (int i = 0; i <= n; i++) {$ X2 F% _/ g$ K2 q. t0 M
for (int j = 0; j <= m; j++) {
# d/ i3 Q- X, R/ P# O- l for (Integer diff : f[i][j]) {
% F+ E( T+ o) t1 K; O7 b' A // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
5 Q. v! J# q0 m( _. P6 E if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {7 C! Q$ E1 p6 B. Y" d# j
f[i + 1][j].add(diff + 1);
/ Y1 v" K7 S( }: p }
# K. V5 t m9 ~5 a/ d1 U // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
0 h1 F& o/ q7 O* [ if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {! I9 h, o& b% l2 b
f[i][j + 1].add(diff - 1);
9 ?- E0 L+ O7 r3 [+ v+ @! ` }4 d: _9 Z$ \; }! @- I+ c! G
// 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
: S) Z" F, I+ B4 Y, q0 U' j7 r, K if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {6 Q( U. A; t" X: C$ s3 p
f[i + 1][j + 1].add(0);
# ?. W! ~; C( A$ B5 K) H }
/ A- Y6 h! D# E& [: o, ?- S // 枚举 s1[i:] 的数字,加入到集合中% N7 z0 G& W5 e Y$ L
for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
8 g* h* O/ }2 p' `! K3 C p = p * 10 + (s1.charAt(o) - '0');0 s: L. X7 s8 p% c
f[o + 1][j].add(diff + p);
9 r, Y# p# L4 d }
$ S2 {, ]" h+ g$ y! K% {$ u' _ // 枚举 s2[j:] 的数字,加入到集合中
# N* s2 K! U3 G% }' K for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {" f$ I2 ^5 a9 ~- ]! Q" d
p = p * 10 + (s2.charAt(o) - '0');7 D( y& H3 n* d: Z. j
f[i][o + 1].add(diff - p);6 ]6 P, \! c. j6 X i5 g
}
+ g. ?, B# ?3 o% ` }- e. }2 _) p2 b5 H8 M. s9 l
}) \) R9 [/ Z# |3 i! l+ h" N
}
* `( i' M; W9 Z. z- N return f[n][m].contains(0);! a' `* G& U( n* Y" \' e: D. {
} k, u) C2 \9 {2 ?$ S
}/ G& h+ N. ^3 U1 u3 ?
|