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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 值相等的最小索引】
7 Q: v9 k" {6 h/ \3 y- C解题思路
( `  K' {8 v; ^: k" ~) t8 m/ a签到题。
! y8 Q# ^- j& `/ v5 y1 D6 n5 R2 P" d$ P! J6 ?! l" r
代码展示+ s$ t' V6 P8 f+ r2 i9 t+ K
# `& x3 o9 H! y7 l% \1 O$ x. R7 }
class Solution {4 O% [4 g, p2 B+ S. A
   public int smallestEqual(int[] nums) {0 A" T; u; m- z+ ?
       for (int i = 0; i < nums.length; i++) {; O5 n% b# |5 {* N
           if (i % 10 == nums[i]) {3 c$ \% N% i, b( |& z
               return i;7 ?7 e' o& z9 m3 c8 ]) G8 E0 b+ Y
          }/ d0 `& ]6 d: \
      }! z" k0 {3 H" `. k9 \
       return -1;* @0 p: i7 Q  @. w$ W- j
  }
9 R7 `) q; I$ Y, b$ ]}9 J. b: d$ H' S& ]

/ y2 R$ \, N' K9 A【 NO.2 找出临界点之间的最小和最大距离】
% `& G' P) I) ?/ a7 }" l解题思路
0 O. D  ?/ v( E" e. [6 F, G& B遍历链表即可。) w# U' z! |, ~% k
# D$ f- ]  u3 i7 b1 c& N- Y( L
代码展示( M3 [8 h9 T, ]+ m% r! e9 h
8 q0 U# K3 X) w  l2 |; O/ {
class Solution {: K, ]. }. F7 o/ U
   public int[] nodesBetweenCriticalPoints(ListNode head) {
! S' ?4 x/ S5 ~1 s1 l8 A9 _& Y       if (head.next == null) {  T2 }# W+ d0 I) c
           return new int[]{-1, -1};- L  e! {9 G2 S; y4 d
      }
: S/ t, h7 K/ H5 K' l       List<Integer> pos = new ArrayList<>();
! y4 H7 W- M& Q; _       int last = head.val;
( D' C+ M" ^% r5 J       int p = 1;6 X$ ?' B; `  h7 G: k
       for (ListNode i = head.next; i.next != null; i = i.next) {
1 [' _6 ^9 c" M0 n* |) N3 K0 o           if (last < i.val && i.next.val < i.val) {( u  n  J( j+ a: x) L' O
               pos.add(p);
; f. W3 Y! j2 k8 q3 M: P3 \0 {          } else if (i.val < last && i.val < i.next.val) {
: f! K- e/ ]3 {               pos.add(p);  B: Y: n' s2 A% k
          }
1 L0 S0 s3 z& t: P4 `           last = i.val;
, f5 ~% I5 p: j9 B: E           p++;
  a/ U9 d$ L- m8 U& e: K' D      }
. Y% n5 \; p0 @( r       if (pos.size() < 2) {  h- F! C5 l  @1 R1 G% F1 x
           return new int[]{-1, -1};
1 t& e/ g* k/ [( C* b' S/ A      }! [% L# V* Y! O8 }
       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};
6 q) N! N: I) n+ Z1 i% P       for (int i = 2; i < pos.size(); i++) {0 a2 L( G; }  ^  \$ ?6 \
           int dis = pos.get(i) - pos.get(i - 1);
, x# L6 _" P; W* L: q           res[0] = Math.min(res[0], dis);
7 U( l7 _* M" r8 C9 I* }: I      }
5 a: W+ U) m- e6 g$ O4 ]! U+ M       return res;/ X) B! q- t) e' k' N% ]5 j" W
  }2 B. }9 e% ?, X4 K" K
}
7 ]7 M; m" Z3 }  m5 t, g
+ B% M( p' ~, u【 NO.3 转化数字的最小运算数】
1 m2 \' q3 B" i2 U; }解题思路
* N2 I+ b" x+ _& p8 l相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。
) m5 m1 S: w3 ]  Y) _: \0 p; O- L1 @
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。' C( E6 r: Z' Y4 q& s

3 H3 Q. ?( Z7 g  _# h( a( l& k代码展示
7 g& F( N2 K4 J
& Q* ^6 w8 `- ~! bclass Solution {: E0 x- N; r# ^" g; j# z
   public int minimumOperations(int[] nums, int start, int goal) {% J9 C* c4 c% P6 w
       int[] min = new int[2001];4 [$ _# ?; z! i% e2 R
       Arrays.fill(min, 0x7fffffff);$ B3 g: R4 ]. @' K' S
       min[start + 1000] = 0;' Z7 H* x3 d9 y& F% |
       LinkedList<Integer> queue = new LinkedList<>();
* K5 g% w0 A: V% u       queue.add(start);
# Q! ]; m; @- ^+ a+ _1 \       while (!queue.isEmpty()) {
1 O9 o, h* `2 Y, V( R7 J           int cur = queue.poll();
1 [& R* Q  _/ \  {0 z6 Q+ I8 [+ B/ ]           int dis = min[cur + 1000] + 1;: z3 B. F  p0 C3 x6 a
           for (int i : nums) {1 v( ^' }& P+ i3 j1 w- t
               int nxt = cur + i;% h; s& o: c* h0 x
               if (nxt == goal) {
4 K, x3 [( ~+ Z0 S1 E3 [                   return dis;9 _4 A5 q+ Y0 P( W  Z
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {! X; J# {3 U2 L; E8 t
                   min[nxt + 1000] = dis;
0 H  ?+ s: S- \! v, s4 S$ B                   queue.add(nxt);
3 G0 [" d4 q5 e. I4 G0 O# l              }, o6 x, Y& r0 N0 Z/ z& o  I' `
          }* b; }( L4 H5 @7 J& o" [6 G
           for (int i : nums) {
2 y6 F' v! N4 G) N% G8 v               int nxt = cur - i;
2 i: ]  q0 Z9 |+ b               if (nxt == goal) {9 B' \- |! J4 r8 @- L# Q% n* B$ Y
                   return dis;- m, ]; O# j" V1 `, X
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
' G8 h: a& f! v. s# _                   min[nxt + 1000] = dis;
' D9 ?0 [$ s: `/ n                   queue.add(nxt);8 g' @. X/ w3 R/ ]1 i1 \' }( G
              }: F6 H, f5 [( g* \% G
          }
8 X  `) T* [: `9 z- S           for (int i : nums) {
5 ?3 w$ Z0 o& Z' c+ O               int nxt = cur ^ i;
# @. \7 w2 O) [: J( f               if (nxt == goal) {+ ], n, y* T! Y4 Z. @6 Q  ]4 C
                   return dis;
! w% a7 i! Z/ t( s9 y. o0 F              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {5 @0 i. \' i- B( X0 w  I* G- r% [
                   min[nxt + 1000] = dis;9 a' K1 V; ]7 P4 I& T2 n
                   queue.add(nxt);( }3 x0 w4 L6 F% O* p! k9 R
              }& ], l' g7 T/ `. y3 B5 \- B
          }6 H, C. _3 u7 J& {* G
      }  ~* N/ t5 X- O# w6 V
       return -1;
- J' _  }, w! h% a$ v  }* M0 t) ?' I6 H& O: O* D
}" j  C+ x4 A, e5 k$ I
( S" b& ]1 S9 R4 P3 D# F/ I
【 NO.4 同源字符串检测】1 D% f7 t; D  `4 a$ |
解题思路
4 u& N1 j( M2 Q, a  h( L7 r动态规划,细节见注释。
3 ~) j+ q. o- f1 k. s3 U. L' ^1 i. d- `. A$ u( {5 y
代码展示
* y& x& e, I- V$ b# K# @" |# m( i, M& `& M' y# H5 C
class Solution {
5 ]3 t6 M% w$ a# T   public boolean possiblyEquals(String s1, String s2) {+ ?  ?7 Q" o) {; ]0 t' }
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
# b( E! K2 q+ x# y       Set<Integer>[][] f = new Set[41][41];  J) F2 A/ s3 I+ |& T' f
       for (int i = 0; i <= 40; i++) {' g0 J6 L  }  m. }/ L
           for (int j = 0; j <= 40; j++) {& g  v+ j, [7 H
               f[i][j] = new HashSet<>();
! [# z% v) ?( l          }
) k5 j9 [$ K( ~0 ^- n) c" Q      }
7 Q, j( u, V, T- y4 k; k" k. O       int n = s1.length();
2 Y6 _) g2 \, f0 b; T       int m = s2.length();
0 F$ l2 r: ~8 I3 _       f[0][0].add(0); // 初始化 f[0][0] = {0}
% R/ S# G8 v; C8 N  C$ z3 H9 w5 F       for (int i = 0; i <= n; i++) {% _' u# q3 m6 {* |+ M3 D4 W* X
           for (int j = 0; j <= m; j++) {7 x5 T+ t* B7 ~
               for (Integer diff : f[i][j]) {0 s# s# h/ g- ]! Q: G4 {3 z2 G* e% V
                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
* Q6 r7 l( O7 z( s" M; i                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {
3 x; Q3 b  K" }                       f[i + 1][j].add(diff + 1);3 `2 A1 C! p/ T) O4 c# w
                  }
  n4 }3 F' c4 U1 |, g- C5 D' `                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉; e: Q9 t6 \+ v' i: K
                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {: w9 V, [) K. A/ L8 U" O; _+ w! h
                       f[i][j + 1].add(diff - 1);
0 Z$ q; B$ ?8 b' ?. r3 p                  }
( ~3 L5 Z* H4 }: F. O                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)" z  s4 m3 E2 Z8 d* W/ C
                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {% b" }( C. R% Z% W6 U! d
                       f[i + 1][j + 1].add(0);
* W1 b( d) ^- @+ ]                  }
. q$ M( N7 D1 R8 C5 C& [  @                   // 枚举 s1[i:] 的数字,加入到集合中
3 R6 m1 H9 L. Q                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
2 F' N7 j) l8 X9 I, T3 s5 D' f                       p = p * 10 + (s1.charAt(o) - '0');2 s. W  M  P. D/ o, [( p
                       f[o + 1][j].add(diff + p);
( T/ A/ I$ J, Z: b                  }7 i" }( V3 C. y- U/ M  a
                   // 枚举 s2[j:] 的数字,加入到集合中5 M$ T* n0 A! @  t8 Q) X5 f
                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {: Y2 V0 ~' r$ x3 r& l
                       p = p * 10 + (s2.charAt(o) - '0');! {# r& m0 ?+ E/ w3 L
                       f[i][o + 1].add(diff - p);
- I, K$ n7 V) I                  }, y- p/ L- W* X7 [6 S+ p
              }- u: K, M  f2 j* L
          }7 e$ b+ W, \2 Y! W( E& z# p# S
      }" y" v- d0 H  \- g. y- L
       return f[n][m].contains(0);" R" a# o# _: p* A5 F
  }
4 y9 J& Y' c8 Q7 e" X}
" ^4 q( K1 j3 R& m
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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