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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

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- @
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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