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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 值相等的最小索引】
1 c% T5 k, \! d2 e解题思路: k) F! B8 l4 P" U9 Y& W$ ?
签到题。
6 O! z7 K; \4 W4 a& K
* {7 w% y7 @/ e7 h5 Y代码展示
! [; T: i; O8 M* t# W6 q7 H1 @3 A: W/ @; ^8 w
class Solution {
/ _9 N; y1 A4 x8 ^# O   public int smallestEqual(int[] nums) {
3 l7 v4 R: b2 U4 r" Z7 {* @% F       for (int i = 0; i < nums.length; i++) {
5 v" Y4 k) @( W# h           if (i % 10 == nums[i]) {
/ l' p$ \) Z- v' V: y$ k- m2 m               return i;
) `- V4 m3 [; a2 `1 \# N          }* Z" ], @$ Q2 `+ z2 X6 U
      }. L" Y' W/ C3 t; g( V
       return -1;
1 M0 z& F  Q( R  }3 |) M) D( C0 S3 U: I( L* y2 t
}
: u3 d" I/ Y, m! [* Z9 f
: ~0 G- ~5 X9 H6 F: R& F【 NO.2 找出临界点之间的最小和最大距离】$ I, [# D2 u! J% t2 T5 V
解题思路
. a$ B# S) A5 h$ t' ?% G6 J遍历链表即可。
$ v% `! _- N5 K1 r1 Y% R' [4 q: Y9 w6 x. l2 }8 U
代码展示7 e) a" O& B$ L5 p2 R4 m, s$ [

, Z( t8 r9 y1 w2 K9 \. Q7 _% Oclass Solution {& q* q1 q$ c2 ~
   public int[] nodesBetweenCriticalPoints(ListNode head) {: A: a9 X0 D' q
       if (head.next == null) {- h  x4 U: \  b8 {% ]! p
           return new int[]{-1, -1};
' s( q) Z' [6 a& G7 ~( N6 A! j      }
( N" d8 ]' U# W& P& E' c       List<Integer> pos = new ArrayList<>();" x5 P" u7 T8 ]' K' @1 t; G* `
       int last = head.val;0 r; ~4 X1 K- c: N
       int p = 1;- z' \" V, S. E8 X  S4 D) _! i
       for (ListNode i = head.next; i.next != null; i = i.next) {+ o# Z% b& L2 D6 @+ a- q
           if (last < i.val && i.next.val < i.val) {
9 m$ C; c0 e( S' K8 F8 u               pos.add(p);. _9 h& s  {" F# [
          } else if (i.val < last && i.val < i.next.val) {) K4 Z$ @% l* o1 O% r
               pos.add(p);# o$ o, k4 i+ x5 y5 S+ f: i* P
          }
) [. f: M4 l1 o8 F5 F8 t           last = i.val;2 K, E9 g# O; ]9 [* S# v' h
           p++;0 ?, h8 \* S* g! D4 T4 ]
      }$ L: M% S4 t1 Z. h! M
       if (pos.size() < 2) {! e' ^- j" ^# M0 |# w! u
           return new int[]{-1, -1};
7 w; e1 A1 ~  @6 v      }
. y! E; J! |% y5 M, S% O       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};( f2 n# n5 |6 G3 r( u* n1 @1 j0 a
       for (int i = 2; i < pos.size(); i++) {
1 `) q" T9 U" Y8 z" n           int dis = pos.get(i) - pos.get(i - 1);
& m0 a+ p( K- s. x0 [           res[0] = Math.min(res[0], dis);- ]" y/ j2 d8 @: ]
      }3 f, n/ P5 g( F# g+ n. g- U- Z
       return res;
; I% X, N7 N; _7 G7 l' Y  }8 v+ e8 N( k; J8 ^( C
}
" r) J/ x7 {, W* J* v7 B! |7 N% N9 a
【 NO.3 转化数字的最小运算数】+ }" I8 p) e! q
解题思路/ j! M) Y/ V# J& y
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。
7 z# W" L8 d+ _: N' A0 |9 _: [2 @9 I  ?4 ?0 ?  Q
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。/ E5 P6 t* g' |9 ~( l" v# z+ p" b

3 d) x/ m+ G* }1 `, S% I* M: L/ J( N代码展示( N7 Z0 U" j0 z( k: X- [
$ K9 B& q- F7 u5 D  u- N
class Solution {
- ?) o7 @; G7 J% ^- r" s9 }2 _   public int minimumOperations(int[] nums, int start, int goal) {
/ `6 L9 s* Q, m+ c' T       int[] min = new int[2001];. Q. V- ~: g7 F. Q" f" f
       Arrays.fill(min, 0x7fffffff);
# @/ @. C1 k% ^* c/ z4 D       min[start + 1000] = 0;! _' Y1 v5 j3 d
       LinkedList<Integer> queue = new LinkedList<>();
4 ]8 T" ]+ b2 i5 a2 Q6 |: X0 Z0 W       queue.add(start);- n' t4 v+ `# f$ T* q" Y# B
       while (!queue.isEmpty()) {3 j! Q) p" C7 G7 s2 a
           int cur = queue.poll();  P( k% a" l$ G/ u
           int dis = min[cur + 1000] + 1;
7 Z! b: D% u/ w& s$ g/ |           for (int i : nums) {
: i, I# h3 L- @, [7 y2 A& G- H               int nxt = cur + i;  `9 H7 |/ O) t3 ^2 x
               if (nxt == goal) {" |3 w. a2 ^5 H3 W. d! ]1 Q4 v
                   return dis;
$ j! }1 q2 k! ]9 M              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
7 h" j* Z" M" F                   min[nxt + 1000] = dis;
4 G7 M# `8 |* H% Q: t: [                   queue.add(nxt);; L8 @$ f( r% {4 q1 c$ ~0 A
              }
1 {4 e# a2 t) I  ~, {! q% R) p: L          }
7 d* o/ m* Y" N% J6 J           for (int i : nums) {
' l- f: f% [$ @* y, w, n9 P               int nxt = cur - i;. }, p+ |& {5 B; }) X, p3 @& l
               if (nxt == goal) {0 I% w' L7 q6 x( j. d8 B
                   return dis;6 e5 l* R$ n8 o  E( r+ v
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
5 u9 \0 W1 Q4 h& K7 x) }$ h, k                   min[nxt + 1000] = dis;) i4 v! Q* M$ G+ t
                   queue.add(nxt);
5 S2 j- B; Q! }              }
1 h" E* G, H( ]          }
1 P/ E9 K. L% g- I% j           for (int i : nums) {
8 k3 |3 D# i9 B# {4 ?1 g               int nxt = cur ^ i;( ?- J8 r6 R7 I6 K; }: j
               if (nxt == goal) {
9 a/ u9 c. S% f. X7 _) x( V; J                   return dis;
& A9 i# n4 @( b( |( p& ~              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
% }% s; `3 g! D                   min[nxt + 1000] = dis;# h$ W* M+ B  p$ V3 L; {! n
                   queue.add(nxt);
! _- C# Q1 X  j$ t9 U0 M$ H              }3 V, e% r' [/ r
          }
, ^' C( L; e  w0 q1 i# @/ y" O' l- j      }$ j5 T% R6 Q& P, e6 N2 m
       return -1;2 a7 H, v4 n; K! ^
  }
; c0 h; v( H; x( Q}
3 m) z2 x' ^* v& c  C( n( l& p5 A, h) g6 }3 a* P7 J% ], i% f( F; z+ W# c
【 NO.4 同源字符串检测】% P; f: V  A0 W# [
解题思路
/ L. r2 E; w0 H' o: m) n/ Q动态规划,细节见注释。
7 Q  }, ~9 q6 j, n2 n$ M* O" g; R$ m- i, V6 c5 Z: p, a- y
代码展示
% D; N6 v# `$ E! S
- `& c$ O# j, ?. Pclass Solution {
  l0 ?- C1 d: ]# E3 y  \$ G0 @$ r   public boolean possiblyEquals(String s1, String s2) {2 P6 T' K: M3 c" f7 G: E+ v0 W5 q: N
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
7 E! n3 @8 m8 c9 H3 q! [) r0 h       Set<Integer>[][] f = new Set[41][41];
- H4 J0 b: B- ]9 ?1 B       for (int i = 0; i <= 40; i++) {
3 d: w$ G; R; V' y! `# t$ d           for (int j = 0; j <= 40; j++) {% R- x- d. O  e( o
               f[i][j] = new HashSet<>();' G4 u" D) X' g: X! k$ X
          }2 f( Z) x  r- g2 r% U# @8 k0 f8 D: d
      }7 R' X% g( \: K; ?
       int n = s1.length();
- ]  t% v1 j* ?2 h  s: b       int m = s2.length();7 L* X6 e: V4 @; S/ Z, g7 b2 g5 G
       f[0][0].add(0); // 初始化 f[0][0] = {0}
6 k8 H- @& S' y: ]  K- X( S       for (int i = 0; i <= n; i++) {7 n8 ?- Y  ~0 R6 I, u
           for (int j = 0; j <= m; j++) {! F4 ?7 q, z! @$ S
               for (Integer diff : f[i][j]) {
1 R2 Q% o/ v  W. j9 N7 c% c                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉, l, G0 k/ ]9 y
                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {
# O# S9 [: a# D: p* ~* C                       f[i + 1][j].add(diff + 1);
  P+ C% ?) @3 g! P' O+ d" t                  }
! G; e; i, V! L                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉% M9 e. {  s- v$ Z1 b- t
                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
5 Q% [) H! q# ^/ \+ u                       f[i][j + 1].add(diff - 1);& S: ~9 t3 b1 K0 R8 N0 x
                  }/ ?/ k8 Z8 O& F3 c
                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
& g) A! K9 S# Y% y4 w                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {
) E5 B( p7 t7 R! x4 @                       f[i + 1][j + 1].add(0);
: n' T; f: @9 \# W- M                  }
  e# I$ }( p+ V' x0 n5 j; }                   // 枚举 s1[i:] 的数字,加入到集合中$ v: F( g0 X  _
                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {8 {4 @1 |1 m% X5 m- o
                       p = p * 10 + (s1.charAt(o) - '0');6 e" k) a4 K" k2 b: R$ M( x
                       f[o + 1][j].add(diff + p);
* T. S3 e+ A' Y: `: l) _1 A5 i7 K                  }. d5 b/ \! u- ]9 [7 c- x/ }; C2 ?
                   // 枚举 s2[j:] 的数字,加入到集合中0 j, N3 z$ p8 m& I
                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {
: W% e& ~+ m& ^                       p = p * 10 + (s2.charAt(o) - '0');5 _+ l% C+ m0 F7 _5 G
                       f[i][o + 1].add(diff - p);, d7 h+ G9 o; D; F" s- O+ G% }
                  }( c7 f3 C- q, J: h7 o
              }& Q4 w# }6 W- B3 F% |3 U5 J
          }) o9 j+ h9 F/ S9 T  g0 ?
      }+ V. s0 V% f, G& f4 U
       return f[n][m].contains(0);
3 ~7 U: P1 K, v2 q4 D( e  }7 h3 \9 M& F' y  @8 ^$ N
}
! p1 r! z/ k. c* R% Y$ S
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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