找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法LeetCode Weekly Contest 265解题报告

上岸算法 回复:0 | 查看:2589 | 发表于 2021-10-31 22:58:16 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
【 NO.1 值相等的最小索引】
  G% B  B5 Y' W  d& s5 f1 w解题思路
* [) I5 u- x" w: r" e  O6 k签到题。1 r# i* _+ r. X4 o& j
- K( o- G/ K$ C/ b: G- p
代码展示# F3 W( h" c5 h, ~

8 U5 W1 S; K; N  L' s. iclass Solution {% Z1 ?* _6 q0 I. b
   public int smallestEqual(int[] nums) {
/ l- v3 E6 b  w6 d       for (int i = 0; i < nums.length; i++) {* b) f5 P0 {- q* u2 p
           if (i % 10 == nums[i]) {* s5 M: m8 a4 B
               return i;) I/ B' Y  h5 N/ y: c- ~. E
          }/ a2 d# ]1 {6 u2 `8 Z; B
      }
# _/ A9 @$ }  m! t8 i8 X/ m, K       return -1;
7 X% ^3 s1 H  u% C1 H  }
0 z9 w+ `. s) n6 Y* ^}
) [! n; m( ?" v! c! w; D9 ]+ ~7 D$ T, n0 @
【 NO.2 找出临界点之间的最小和最大距离】
5 T" _3 ^: u3 m! D0 K- L7 w( I解题思路( z2 |, z4 E0 g' c  h- {" `
遍历链表即可。
" W+ G% q4 p3 e
* S1 L2 W6 t  c9 g代码展示: l7 R# y" e* ~" I2 K
3 E2 c5 A% N* r
class Solution {
( x9 f& B4 ^6 ~2 i4 r2 g   public int[] nodesBetweenCriticalPoints(ListNode head) {% z! C( f( U" x8 S; l/ m
       if (head.next == null) {
/ D* p; l, Y' `6 U7 ?6 X' m; ?2 n: A( b           return new int[]{-1, -1};2 {3 b5 o# E$ {# J4 s7 I/ _
      }
. Z2 s! I; }( T# l" _  W       List<Integer> pos = new ArrayList<>();
2 j  J) S5 @7 ?) K0 W       int last = head.val;
; F+ O* ]# F9 J! J1 ?7 g       int p = 1;
. O: N) ]. _  m1 |       for (ListNode i = head.next; i.next != null; i = i.next) {1 v0 G: e: U. d* X3 H
           if (last < i.val && i.next.val < i.val) {
- ?% Q. t# k0 \$ N5 y1 i5 _               pos.add(p);
* X% S; j; J$ r; a          } else if (i.val < last && i.val < i.next.val) {
% F8 C$ @% l1 r& @               pos.add(p);
: {# n$ P6 M& g0 O; }$ g          }# w; ^+ V* }  B% G' \
           last = i.val;+ X% S% l9 V% I3 o
           p++;
0 p& }. f! e) B8 e8 T8 B; J" ~      }# ?% \  Q" X0 g- |
       if (pos.size() < 2) {
* t' n' k* s( c           return new int[]{-1, -1};
# p; ]% \" ?9 i) n) X" q      }
6 V7 K5 y: b, M0 Y# i7 i3 w0 q       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};- z* l3 M: \) X- J1 q1 I
       for (int i = 2; i < pos.size(); i++) {, Q- L1 }# j5 k5 Z( ?4 u  i+ a1 K
           int dis = pos.get(i) - pos.get(i - 1);( w2 a3 y, w+ V$ P) T/ J
           res[0] = Math.min(res[0], dis);1 C6 x+ E: o, k# s! v
      }
0 P+ w6 c* ]! v+ ]7 w6 f7 C- J       return res;
9 v% `  ^: J* S9 x) S  }
; R: T1 B7 O9 |! V) ~# x}
  b+ v7 v" a- g& |6 B, p7 b8 c- y. X1 y( Q$ K( V% t: K" b
【 NO.3 转化数字的最小运算数】# W6 J; I9 l" o" |2 H* T
解题思路
2 ~; r+ Y2 M5 i: @相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。
6 H% u5 ]6 f+ p% E2 X$ R8 _2 n' L7 F' U6 L+ L, J3 J. p1 R
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
% B4 \$ K7 ^8 b2 {1 v
0 q6 L* D# V6 A3 h: z; o) L代码展示) u0 W3 y! ]3 A( a

/ n* B4 R( Z  _* A* r& vclass Solution {  a6 ~) F( y6 D1 B
   public int minimumOperations(int[] nums, int start, int goal) {; {8 u% I1 x) W3 E
       int[] min = new int[2001];
% r. l6 a4 }( y" N% _8 f* K       Arrays.fill(min, 0x7fffffff);4 s2 m/ z9 X+ S' v; P1 \& o. s+ ?$ e
       min[start + 1000] = 0;' u7 @/ `# C2 f% ~/ P& ^$ J
       LinkedList<Integer> queue = new LinkedList<>();
& E7 ?* q' Q$ E( a" h       queue.add(start);
* d  f0 t; q& i       while (!queue.isEmpty()) {
+ @* F5 p4 g4 ?           int cur = queue.poll();2 L( O; H, ^/ g( d1 D  H
           int dis = min[cur + 1000] + 1;  ?  T3 K9 x; X" E
           for (int i : nums) {
- C3 k; Z* K2 W# V               int nxt = cur + i;
: l% A4 ?9 o# U# \7 n  {1 G8 _               if (nxt == goal) {, N/ l! I2 m8 ~2 L. [; p
                   return dis;# n% ^' I2 X0 l" A. s6 |
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {6 a6 @* n& e7 U6 ]8 r
                   min[nxt + 1000] = dis;! k6 D/ n# B+ Q! r  V  s9 [/ D5 q
                   queue.add(nxt);( C/ O* Z/ x$ Z3 j
              }* P  \0 a, |+ r" T4 n! E
          }
8 L4 P/ R/ K/ l2 n& H           for (int i : nums) {8 X8 }( t* x$ Y% r, G% B; ~
               int nxt = cur - i;. [- `; ^8 S5 v: w4 g5 S
               if (nxt == goal) {
) c9 w- t$ @+ [. c- ?  t* p9 q                   return dis;
' A$ u7 [7 _8 x+ n, }9 V+ [( z              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {5 H2 R* M5 O, D. U' }2 \- V
                   min[nxt + 1000] = dis;' G% v9 R3 R7 E
                   queue.add(nxt);
) o: O. h, A, @- y1 ~8 Q; Q$ ^: y3 }; @              }
" V7 O* ^1 D; |. k% L8 f( B( y          }& w5 V3 e4 q) h6 k5 Y
           for (int i : nums) {3 o- a% ~; Q9 B# o
               int nxt = cur ^ i;6 n; a* S/ J5 p2 s: ?' u2 c
               if (nxt == goal) {! y* U7 u3 f0 V4 Z  v
                   return dis;
. a* a9 z' `' \              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
: z, P+ k2 @0 q1 N                   min[nxt + 1000] = dis;
( D% ?0 \( {, F8 ^                   queue.add(nxt);
8 a$ M2 m8 j2 q. V1 W4 j              }. `9 H( ^' s+ L+ b& M4 x
          }5 I9 T& K( T$ e/ u
      }& S7 F6 \! d, T) f0 [
       return -1;' j2 ^, h! B# q6 y, G
  }) p& A% v$ T& w, v# v
}& z1 ?: P. \. U7 q

) ?' n) B% u/ ^8 J【 NO.4 同源字符串检测】
9 C1 i0 Y" [& x5 K! R8 a* C; J解题思路# T; S9 k8 B& t8 m% `( F
动态规划,细节见注释。2 m6 |. k; P" p# S0 X
* t# K% p7 E9 J$ P
代码展示' Z. J' X  U5 G. G  g1 y
% ~4 |# m& l( A8 ~
class Solution {
/ {  i" B# X. m6 U: {$ q$ J   public boolean possiblyEquals(String s1, String s2) {4 x5 S# c5 M7 r5 G+ }
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
% \6 F' @3 L1 y7 V       Set<Integer>[][] f = new Set[41][41];4 g/ B3 ]) C; P( N# J
       for (int i = 0; i <= 40; i++) {
* A: Q: g1 w* S           for (int j = 0; j <= 40; j++) {
* A6 K0 @: S% l) {9 g               f[i][j] = new HashSet<>();
& H" _, h( N# d          }
1 v& q) T% @  Q6 ?      }
5 c9 h# Z- N6 i" V       int n = s1.length();+ i& F3 W3 G7 H: o' O7 l4 ^
       int m = s2.length();/ ]# O9 c- v. _1 Y
       f[0][0].add(0); // 初始化 f[0][0] = {0}; O- R5 |, D  C* D4 i* Y
       for (int i = 0; i <= n; i++) {
0 Q8 e2 H1 @. Z) f! a$ v9 A" J           for (int j = 0; j <= m; j++) {, T$ \0 W8 r) p; ^' |; z1 T% j
               for (Integer diff : f[i][j]) {
8 a) k' O* O9 `' f% ?3 `7 x4 X& @                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
) N0 M$ U4 c6 K9 z                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {
$ ^; x: k2 |+ x1 w& S7 r                       f[i + 1][j].add(diff + 1);
$ W7 C; x& \2 w! u                  }
% ]  n4 t1 h" X  T, U                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉5 a3 E9 m/ w% Q: b. X: E4 x
                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
/ X, g1 j5 @1 Z3 m3 o3 ~                       f[i][j + 1].add(diff - 1);$ c2 U, |5 p' H+ \" d& k, X
                  }
/ Y( l9 v, _) \# y0 f0 W) c  Q! t' F                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
- D$ l( ~3 U; r: I/ _) I( N' ]1 u3 a                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {5 }% b4 d8 U1 k8 _, l; A" P  [
                       f[i + 1][j + 1].add(0);
; _0 M6 M5 A) L5 K7 r                  }
; R3 z, j8 M4 z% b                   // 枚举 s1[i:] 的数字,加入到集合中
, r' @: N# Y. O: D3 |. S! d                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
& n. ~: P9 X8 ]6 K2 Q. l                       p = p * 10 + (s1.charAt(o) - '0');
, G7 A3 t3 E3 y7 ^5 G  c                       f[o + 1][j].add(diff + p);- r; \) e" I6 |
                  }. J5 T+ o9 O9 _% }2 Q( y5 e
                   // 枚举 s2[j:] 的数字,加入到集合中+ R; I7 \( L- {7 k3 p' e: o
                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {# E) O+ O! m; Z/ V2 E1 |& P
                       p = p * 10 + (s2.charAt(o) - '0');
: P$ C5 n- O1 X- H                       f[i][o + 1].add(diff - p);
" Y; h* K+ D0 _+ J; H( k$ N$ g                  }) A% c6 \# m8 e! r( Q7 i
              }
4 h5 w9 Z& ^6 v5 w8 o          }
. W+ B# s7 \. d1 [6 {      }
1 h* U! u1 ~/ A       return f[n][m].contains(0);: Y& t/ R& Y: m
  }- Q! O( @# E. C% z/ U* a& A
}# y6 B; z3 v, A% q. B' y% w! F9 U
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表