登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 值相等的最小索引】
; z. I- J8 U( Z1 E$ o! N# N解题思路
0 {" J: b# e3 ^签到题。9 o- _2 G9 G$ E. f- [
+ V6 i7 h: K- u0 |3 i: \: ~代码展示- s3 ^( `$ M4 ?1 y
& z: \1 m% [* \& n/ mclass Solution {
& Z5 r9 y7 x$ y, s5 D public int smallestEqual(int[] nums) {
5 N; r3 W9 O* {5 P6 X' _, F* D0 y for (int i = 0; i < nums.length; i++) {& X3 q) ^% o* u+ M! T) o
if (i % 10 == nums[i]) {7 R" W P- J- F% \% x0 J
return i;
- N8 E# q6 i& M" ` }% G2 h8 v, `- N
}
9 y5 g7 {4 k' q2 _1 j2 C ] return -1;
1 i# b2 y+ g( [/ d" B }
9 F4 F% E. Z# l$ }}7 i! w9 [3 ^) ~/ o( e
# N& R# g- K4 v, M( L+ d3 c8 z2 M
【 NO.2 找出临界点之间的最小和最大距离】& ]6 u- V9 a/ L: p" L* T/ Y
解题思路
& F2 v5 _2 K. R* l( P遍历链表即可。& u, ]7 \: D/ H9 t+ j
" K5 j5 P8 A6 x. g( S2 P% m代码展示
9 I, V* J- d( \* E. g1 ]( B8 v7 _% ~+ C- U1 ]$ f+ U/ [* C5 P
class Solution {
8 v n4 F# {; p# J, |2 e public int[] nodesBetweenCriticalPoints(ListNode head) {. o8 I2 e+ T5 Y) B7 F
if (head.next == null) {
& x3 H$ h7 K* v/ p return new int[]{-1, -1};
# ]* S. e, n$ |+ w }
- R+ X& D5 ]8 p2 x3 O0 B2 s A List<Integer> pos = new ArrayList<>();
* @# j5 ~+ R Q \ int last = head.val;- _) Z1 _! B( W0 F
int p = 1;7 t6 M& t) `9 p% o
for (ListNode i = head.next; i.next != null; i = i.next) {3 v6 L. e* X$ _) J) C X! L
if (last < i.val && i.next.val < i.val) {
, s: q! S6 D7 y/ i* z pos.add(p);
8 ~0 q$ `, a% Y z2 l+ n/ l } else if (i.val < last && i.val < i.next.val) {
6 W, @# K2 a( N2 n pos.add(p);
( p! \& s1 _8 |8 \6 w% l }) ~$ f# ?+ }& D' o& q |3 W9 u
last = i.val;; k: K& Z, S; h( g7 P4 w
p++;
- S7 D( _7 h" [' _+ E$ D3 { }2 L8 d5 L- Q7 n$ [% J
if (pos.size() < 2) {
( D3 @- ~# p* P# y return new int[]{-1, -1};
2 a! w% @" V& _# B9 l7 O1 X }: N8 j, ]$ W; h1 a; d/ u U5 a
int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)}; h. J6 t, y6 }2 C! H; Q" p
for (int i = 2; i < pos.size(); i++) {5 a+ C4 T' [7 ]0 [- n
int dis = pos.get(i) - pos.get(i - 1);0 b" Y5 t$ {" D3 ?- H& \
res[0] = Math.min(res[0], dis);* X, S- q* Y6 j& H; x
}% | T4 v' h' V( @3 u T6 c3 _
return res;
) A5 U' |6 \3 B% t }
; R- m# n* e9 f; {}$ [+ x" k# L. ] m# x0 y# b
9 E' I, g" [# c' A. F* d7 B* G
【 NO.3 转化数字的最小运算数】& z2 Z* ]- X W" _
解题思路4 P& x* w) k+ @$ ?8 a; T* n- q
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。) E0 \- e1 O1 j
9 A- c& k" ]! [: p' M% w8 N5 _# m
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
3 K C; C y# J6 G5 ^- u% V" @
( M# d1 Z! g' J' `2 O% Y. n代码展示
/ r6 {) z: ~5 c' F: _
* B" K# E/ o# p+ Jclass Solution {
" @+ s0 I0 e, z/ j public int minimumOperations(int[] nums, int start, int goal) {1 l6 e. b* D8 P
int[] min = new int[2001];9 @5 x- @6 ` m0 K% r/ E
Arrays.fill(min, 0x7fffffff);& |2 |% q: h9 A
min[start + 1000] = 0;
* L( O" O+ v+ ^5 P1 ^+ j' k LinkedList<Integer> queue = new LinkedList<>();+ O; e+ `- P U
queue.add(start);/ W8 q, n( N4 `+ P( ~9 U2 ~
while (!queue.isEmpty()) {8 f1 r7 B1 t# w6 Q& G6 g
int cur = queue.poll();4 k: C. I; z% R
int dis = min[cur + 1000] + 1;
- V1 L: X4 y5 V! o) g5 B for (int i : nums) {
; R y% V1 N P int nxt = cur + i;
: P( E) h# `/ c/ B! t5 V1 ]# E if (nxt == goal) {
- W& C% Q" Y. L+ {5 E2 @4 u/ h return dis;
. L8 h( |, p/ P/ Q. P } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
% ]5 n) I: k. J: e min[nxt + 1000] = dis;
4 B C& r) D2 v: s* b9 S queue.add(nxt);
) W$ J* q" W0 B; z6 P/ B8 Z }
. o$ x5 B0 Q3 j0 {6 a }
$ e0 l2 n- d! c0 i$ n( @ for (int i : nums) {
" {2 W) c5 F p7 y int nxt = cur - i;
4 K# l2 K% ^& j: l3 n: Z if (nxt == goal) {" l! [9 T4 d. B/ x' t( K
return dis;
# n7 g6 ^8 b; U( P } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
& n7 N8 H; Z) n( c( G min[nxt + 1000] = dis;
2 X0 ^9 n( f0 U/ c9 T9 V1 f5 p queue.add(nxt);' t( }2 ?) G4 H1 y
}
9 o$ t; p0 j1 u: u }# x2 O3 k% x* F+ [3 K
for (int i : nums) {
T6 u% w. H$ ~8 ~. ?% t5 @ int nxt = cur ^ i;
+ b4 M! v7 H6 n1 x* V, ?* ]. t# l: T if (nxt == goal) {! I8 J+ W) l& p* N# z( I3 ?& M1 p
return dis;
( T5 j( o* y8 r3 K9 Z: B. M } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
8 [) n8 Z' h; x/ [! w) J min[nxt + 1000] = dis;
; u+ I, ?8 }* r' H/ m queue.add(nxt);
* w2 b1 s1 i) Z% Q }% v7 ?& I5 m& ?0 |* B- @6 Z3 v
}
0 U& n' Z }/ e4 { }9 C6 I( r& ^3 t5 ^$ k- ~1 V& }8 C
return -1;
& j5 p+ \) m. u1 k } j7 h& r4 T- k$ H; `$ j
}
' s$ _) w3 p) J; K! s5 |4 ~
6 m5 ~& M$ X5 }2 B' R/ L【 NO.4 同源字符串检测】
3 g* l' k) F: Y解题思路; S2 y+ X4 U: w2 ] C
动态规划,细节见注释。
, H3 \0 | F& W1 c9 Q
! r, Q7 e7 s' R+ I( ?2 t代码展示
8 O$ f) s7 j! z2 M3 ^8 C a
, z) t2 y. I; f, ]4 o9 e/ a+ yclass Solution {
" l* v! g, d1 [0 K; v* H public boolean possiblyEquals(String s1, String s2) {- p1 s4 m' z/ Z2 B
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差4 Z; Z1 l9 i7 \5 G9 D5 j
Set<Integer>[][] f = new Set[41][41];% w" y$ ^' f7 B2 B- ]0 r& {. `8 R
for (int i = 0; i <= 40; i++) {
: U1 i: m" ~2 Z# _1 a3 y/ \ for (int j = 0; j <= 40; j++) {) w2 A& r9 i1 h1 b6 i
f[i][j] = new HashSet<>();3 G- ?! y. N3 x0 N7 @
}
9 R, @9 v3 ~) l: J" Q8 Y# R }+ ^7 z k; }2 W# K8 H. R
int n = s1.length();2 l3 x+ `- |& o {- K. k7 w
int m = s2.length();
5 X' ~9 r; }5 l# ]( ~5 s& _9 I f[0][0].add(0); // 初始化 f[0][0] = {0}
1 q6 H9 |7 E& r4 } for (int i = 0; i <= n; i++) {
# `1 R4 x c+ u: S for (int j = 0; j <= m; j++) {
$ i- d' p$ x- r% I. q; @$ O5 E for (Integer diff : f[i][j]) {5 H, n! @8 w3 Z$ k9 M1 b( L% [
// 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
' E+ w. c$ U# G# f5 U. t3 Q if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {: _, `9 M9 o+ d( _
f[i + 1][j].add(diff + 1);, {0 r; x& g( ^6 m/ n# d
}
) ]" W+ v- L" T, I" `: A // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
+ d# k* T) n" i if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {; W& v8 E* G/ l* w8 v& T0 S
f[i][j + 1].add(diff - 1);
7 e1 c" J7 z3 y9 E3 j! E }
$ |0 U; L( F% J, U // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
) t- F9 t1 D6 w0 e/ K2 P7 Q if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {5 D2 Y) e" m _
f[i + 1][j + 1].add(0);$ A4 V1 ? V% t2 K4 W+ K: a! k
}( T! R" N$ x' U& @" J% B9 ~
// 枚举 s1[i:] 的数字,加入到集合中; T, J8 a! A8 Y1 O+ w5 Q
for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
4 \. w( x1 i/ `* O: G3 C! m p = p * 10 + (s1.charAt(o) - '0');! |! S4 l9 N( Y0 \2 ?0 E
f[o + 1][j].add(diff + p);
. m2 X# m" x6 g }
7 X+ `2 ]4 Y+ l5 W5 M // 枚举 s2[j:] 的数字,加入到集合中
# {! _9 R- i. a2 V8 M& ] for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {/ P' Y# H% u$ U& \
p = p * 10 + (s2.charAt(o) - '0');
( }6 u" {% p, z! N1 [, @( M6 k9 A' A f[i][o + 1].add(diff - p);
' j c+ V* F# T/ J6 {7 z# T }
6 ^- i$ n! |3 k7 b' M: F/ `/ v }- X! Z1 Q( |7 ~& n+ U. F
}8 G# j. w2 d3 w
}* P9 |/ P* S, I5 }8 b& m
return f[n][m].contains(0);7 ]$ A+ c- t5 U: d. W1 m3 t1 U2 z) |
}$ b7 P% Y z* K) y( @8 L- r6 J
}7 m" ?2 [( e5 a& f7 k* `& O" u3 I
|