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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 值相等的最小索引】
/ ~( d( t) f9 `. N% U: h解题思路
, v  F  E; K+ F* l签到题。1 y9 K& U5 L4 u/ l+ R3 J

' O) t/ I7 _/ j( T  p代码展示
/ e' S' b# Q, F# i
! n" Y9 f, [( H6 T4 |% r, M( _class Solution {
# T+ Q" H4 g$ B8 d+ o   public int smallestEqual(int[] nums) {
0 r& R2 ~: z& M  U% f       for (int i = 0; i < nums.length; i++) {1 \2 v1 d4 b' P; }. T8 k4 V
           if (i % 10 == nums[i]) {
" L5 N+ g1 n- }3 f/ k               return i;. q' m3 K- b9 {% _4 _) ]
          }, F/ N6 l$ M- \5 k/ S" f: p
      }
9 A* l7 r( K. c. s8 Q" I+ h       return -1;& o; s% P9 c, q' V; ?! E" c. W4 e
  }
0 _: F& f- z# V}
. v) {- `1 Y  o* p8 b
7 {" Y" a1 a: S1 Y6 s0 S【 NO.2 找出临界点之间的最小和最大距离】7 y: K3 L7 b3 \) ?
解题思路& f# \- }' m* D4 s: K: G  g
遍历链表即可。0 f' v( B; H/ z, g) p8 Z
' W2 i; B& i  X* h
代码展示
8 l7 P. f: Q8 T
$ B- I- m' b+ W: k. z' S0 pclass Solution {
3 O: I% r  c) N- ?   public int[] nodesBetweenCriticalPoints(ListNode head) {
; s8 e% B& ^4 V4 G% c       if (head.next == null) {3 j% X- Q  g# p/ _6 j
           return new int[]{-1, -1};' i2 V+ H9 G, _* }4 P8 ~
      }
( K! W- d4 e! ~' {6 p: ~       List<Integer> pos = new ArrayList<>();
) N& e0 [: o( u, |/ y! M- A       int last = head.val;: k  B# e- b3 H# m/ |' p
       int p = 1;
% E$ c5 J& F- J2 g. C       for (ListNode i = head.next; i.next != null; i = i.next) {
! a/ \# }9 j1 Z1 P) q4 ~# ^; A3 d# h, A           if (last < i.val && i.next.val < i.val) {
# Z0 ~" Q$ I8 R7 U7 ?, `               pos.add(p);/ V& K  R8 W' s# S2 W
          } else if (i.val < last && i.val < i.next.val) {
) Z+ G6 I6 `' d6 J               pos.add(p);/ x, F9 j! Q( D
          }1 S( Z2 Y6 K' R3 W% ~8 B
           last = i.val;( ^# o* i8 |5 T1 ]2 q
           p++;
+ }: E' |2 M' s4 F- o- X; O* G      }
$ ^& M& z7 g4 k: N8 M5 \# L( A( o       if (pos.size() < 2) {0 D& }3 a* v( f3 o0 f  f
           return new int[]{-1, -1};8 h' C/ }9 p+ @# ]2 x
      }
( x$ K' v$ p7 C       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};; S% L+ g6 X. D* c$ S
       for (int i = 2; i < pos.size(); i++) {5 z( h& D+ C1 f5 ^0 ^# @4 _' W
           int dis = pos.get(i) - pos.get(i - 1);) ~1 J4 s% w7 L- Q
           res[0] = Math.min(res[0], dis);
- \8 N, M; O, }' Z+ H      }5 M  B, D* l8 [9 ]
       return res;  Y3 ]- R, ?& |* s( U+ ^
  }
' d, G# j- u% t; F/ L5 k}  y6 ^/ D: O9 a1 |/ l) N6 M

3 M+ ~5 H/ ^5 L& W【 NO.3 转化数字的最小运算数】
+ _5 w0 ~, R" k$ t6 }解题思路
# ?2 U4 I1 a/ R) j2 C相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。0 I( F7 ?0 H5 e9 ]' K3 q( ?- j9 B4 m: k
- I* t1 b% n6 o. @! w& B
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
) b- N3 D1 K/ M3 q) O3 b% |# h, y
7 M/ q2 ~- v- I. s代码展示
' m% t+ g9 ~2 F2 j- U+ d% _+ `) _/ u9 V/ w9 h
class Solution {# H6 ]$ K( }4 z4 c
   public int minimumOperations(int[] nums, int start, int goal) {5 o4 \8 ], U/ e+ O
       int[] min = new int[2001];
' Z8 u: E* E! x' {       Arrays.fill(min, 0x7fffffff);* w2 b6 j$ Y3 _2 H' W# G4 q
       min[start + 1000] = 0;
  {+ l5 i- I) [& D% ?' v       LinkedList<Integer> queue = new LinkedList<>();
! S) e; J) X  B: s* R( ]       queue.add(start);
- G) I5 z; e/ `6 i+ w8 b" [       while (!queue.isEmpty()) {: l. i3 K$ S( S% V. x9 b2 ]( W
           int cur = queue.poll();7 i0 k( R$ k! ~: x* X3 f2 }- ^( }
           int dis = min[cur + 1000] + 1;
3 u; ^/ F* }0 |/ S2 r           for (int i : nums) {
& v4 K  u1 i# z) E8 H% f               int nxt = cur + i;( u$ Z8 r1 h: c2 _1 a3 I/ q3 H
               if (nxt == goal) {* b- }* q7 v8 P+ m. Z! V! e  w) t
                   return dis;; Q3 f( a3 d( T$ O3 g3 v+ I
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) r. G/ C2 P$ r1 P
                   min[nxt + 1000] = dis;/ V, q7 i" E, w) e) z. N
                   queue.add(nxt);
! n3 Z2 h8 }3 r5 Z. t              }  a8 ?. d& V& k. |3 u
          }& y$ m' u. b2 U6 C
           for (int i : nums) {
$ e  l3 ?; @  ?5 T2 m. z               int nxt = cur - i;. M& I9 Y) T& F$ l# p- i( v1 k
               if (nxt == goal) {+ s0 r" ~, k) c% q3 ~" D
                   return dis;) \4 l( D$ t' `4 C; W
              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) N8 ]+ [5 Z! J
                   min[nxt + 1000] = dis;: f& K# \! R9 P/ s% B8 S
                   queue.add(nxt);
. Z8 M7 d  @) k9 H; A1 Q0 i              }9 c% k8 K" D* o/ g3 J9 ~. v
          }
( U: s4 U' A8 J. D/ G7 W) m0 A           for (int i : nums) {, a1 x) i  P  i+ f' l" M
               int nxt = cur ^ i;6 R; X  N) s; H7 B% j. e
               if (nxt == goal) {
8 U$ T! @. T$ C  r                   return dis;
! D; u5 _+ `/ H7 E1 o              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {) U  k6 H; k! k6 s) o5 x
                   min[nxt + 1000] = dis;
4 `$ i# h0 n, S# ?, N                   queue.add(nxt);4 l* `$ ]' M9 s7 @: {3 \- W9 a
              }6 E2 l8 k+ w7 M4 b
          }; G5 h2 a7 ?$ [0 l+ V! z
      }- x. U+ R' R4 h
       return -1;# M: V* n, d2 @7 n' }" M
  }
  h* \8 [- U# h6 k1 \8 @4 k8 c}
7 c2 U7 G, f4 q# X3 d1 `+ a5 U. E9 D" \  x& r' P
【 NO.4 同源字符串检测】  T" i% C! F% Y; F& \# P
解题思路
- `. D  K3 c) k# r4 l+ p0 f动态规划,细节见注释。
! L5 U( z& c  F+ y% l' ~$ h$ o/ k7 G% r7 D% p3 T
代码展示8 u; U4 T0 e8 z( ^! n% M

/ m0 e$ ~9 _& mclass Solution {$ P  ^* X* [6 E* V3 M0 ]# K6 K0 r
   public boolean possiblyEquals(String s1, String s2) {3 I* i/ D; H* `. Z" d: P! a
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差1 J/ `9 ]* N' J  ~7 J, E3 u
       Set<Integer>[][] f = new Set[41][41];8 e9 q1 N2 f* l& j
       for (int i = 0; i <= 40; i++) {
3 r: s% V8 C0 z0 M/ ~) j           for (int j = 0; j <= 40; j++) {6 Z+ K6 M. }  Y, S& O, S% A
               f[i][j] = new HashSet<>();/ n4 c$ A! A7 T' B& Z0 A
          }4 Z3 y. [' O$ {
      }+ ]) ?& |4 y* N! h- d# v
       int n = s1.length();
6 S: `' L( n' x- T& V0 `       int m = s2.length();4 S$ N+ G3 J9 K$ z
       f[0][0].add(0); // 初始化 f[0][0] = {0}
- ^3 V+ Z. b" N  b% E0 g5 V       for (int i = 0; i <= n; i++) {$ X2 F% _/ g$ K2 q. t0 M
           for (int j = 0; j <= m; j++) {
# d/ i3 Q- X, R/ P# O- l               for (Integer diff : f[i][j]) {
% F+ E( T+ o) t1 K; O7 b' A                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
5 Q. v! J# q0 m( _. P6 E                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {7 C! Q$ E1 p6 B. Y" d# j
                       f[i + 1][j].add(diff + 1);
/ Y1 v" K7 S( }: p                  }
# K. V5 t  m9 ~5 a/ d1 U                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
0 h1 F& o/ q7 O* [                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {! I9 h, o& b% l2 b
                       f[i][j + 1].add(diff - 1);
9 ?- E0 L+ O7 r3 [+ v+ @! `                  }4 d: _9 Z$ \; }! @- I+ c! G
                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
: S) Z" F, I+ B4 Y, q0 U' j7 r, K                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {6 Q( U. A; t" X: C$ s3 p
                       f[i + 1][j + 1].add(0);
# ?. W! ~; C( A$ B5 K) H                  }
/ A- Y6 h! D# E& [: o, ?- S                   // 枚举 s1[i:] 的数字,加入到集合中% N7 z0 G& W5 e  Y$ L
                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
8 g* h* O/ }2 p' `! K3 C                       p = p * 10 + (s1.charAt(o) - '0');0 s: L. X7 s8 p% c
                       f[o + 1][j].add(diff + p);
9 r, Y# p# L4 d                  }
$ S2 {, ]" h+ g$ y! K% {$ u' _                   // 枚举 s2[j:] 的数字,加入到集合中
# N* s2 K! U3 G% }' K                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {" f$ I2 ^5 a9 ~- ]! Q" d
                       p = p * 10 + (s2.charAt(o) - '0');7 D( y& H3 n* d: Z. j
                       f[i][o + 1].add(diff - p);6 ]6 P, \! c. j6 X  i5 g
                  }
+ g. ?, B# ?3 o% `              }- e. }2 _) p2 b5 H8 M. s9 l
          }) \) R9 [/ Z# |3 i! l+ h" N
      }
* `( i' M; W9 Z. z- N       return f[n][m].contains(0);! a' `* G& U( n* Y" \' e: D. {
  }  k, u) C2 \9 {2 ?$ S
}/ G& h+ N. ^3 U1 u3 ?
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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