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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 值相等的最小索引】  ^6 R$ t. x$ v: c1 g! H0 u  n
解题思路/ P* r( P4 |  |7 ]# f# a
签到题。2 j1 ^! S4 b* J( h; b

% A4 j( s$ v9 q. }6 T! G5 p代码展示
+ u$ i. c: J+ S- F' N
: n9 G( H7 f8 Y6 k- F3 K) @class Solution {, P; e2 O" u: w- C/ _8 ]4 C
   public int smallestEqual(int[] nums) {% _, J, y' |% d2 v7 ^3 H( s2 J. O
       for (int i = 0; i < nums.length; i++) {
2 a5 c% a' w$ i1 ]: b  G           if (i % 10 == nums[i]) {
7 M5 Q) A- G4 ]8 B               return i;" i, J5 Y4 f3 a4 s5 H
          }
8 f' u/ r( W- q) T      }
! Z9 d/ W" Q( Y5 @- x: R0 X) x       return -1;
; l4 \' A7 w, L5 N- g  }& k+ {* N) k2 ^) |
}# o7 A8 i4 [, N4 f/ o

" Q, z0 M1 r' W; L% j+ k5 R【 NO.2 找出临界点之间的最小和最大距离】9 j7 A% K! ?# S2 j
解题思路3 d2 L8 E3 P$ v8 s
遍历链表即可。
- K* ?! u( F, L  {: H% d1 l. H+ q  a& y
代码展示
+ |( h7 T+ W) D* K# z1 W- ^6 n" {2 k% [7 o# d! O+ ~4 S0 \) H- Y
class Solution {
; p% I' y6 Y$ U. j   public int[] nodesBetweenCriticalPoints(ListNode head) {( r# ^4 V6 u' G5 P# N& J( M) v" J
       if (head.next == null) {
  T( a- O# e7 C! z) `           return new int[]{-1, -1};( O1 Q; j% i8 u3 n9 F) u% m7 @4 C4 t
      }& i7 K  b" I# g
       List<Integer> pos = new ArrayList<>();9 I7 r9 I0 {8 @4 ?* `1 Q+ f6 I
       int last = head.val;+ `& O3 A: a) Y, f
       int p = 1;6 v0 G+ [+ \' q5 a0 c8 V! W
       for (ListNode i = head.next; i.next != null; i = i.next) {
" ~+ ^/ O2 N) Q& ~  e  M           if (last < i.val && i.next.val < i.val) {2 K) k3 H% k+ y/ g/ g; c
               pos.add(p);& t+ ?* S9 [7 e. a' e9 w
          } else if (i.val < last && i.val < i.next.val) {6 m1 J2 E2 i# m
               pos.add(p);
7 Z1 B; S+ ^( V. l6 J9 P' E# h          }5 D7 l$ p! u3 U5 x4 ^! {
           last = i.val;$ b8 ?0 u9 N5 M4 Y/ N) p% @# u. m3 y
           p++;0 \6 n. ^8 R. Z- [% I3 Z
      }
" H* R+ _8 i- y& u# g% T       if (pos.size() < 2) {. j& i8 F" ?0 G) o/ ]. g' M
           return new int[]{-1, -1};
; R- |+ D( X- V7 j9 ?! o! x, T! Y      }
+ z4 F" o, P6 y) a7 K; x       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};
3 E1 t, p. d2 G1 J. t3 H       for (int i = 2; i < pos.size(); i++) {, S* I3 B6 Q9 s3 L% N7 B* a
           int dis = pos.get(i) - pos.get(i - 1);
! b# e% O4 H! Q1 }           res[0] = Math.min(res[0], dis);
& Y7 k7 ~& F- d! N8 T      }
3 u( ?3 {1 a' h" x       return res;, F# t2 N( @% t, A3 Y
  }
1 y: C( B- j7 i) V) p}6 h$ L) F" P6 R4 S; _2 G. s* r

* j5 K" H: |! _7 |! c4 @【 NO.3 转化数字的最小运算数】
( e! y& b. S: N2 L6 Q( @解题思路, L6 O. m  d9 M
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。7 P: A4 S8 d$ M- B6 z

+ |! i3 }, L' `& f% e因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。0 n. y; m5 \- u8 P! b
3 X% \# `( E! W( g
代码展示
0 G/ [/ C2 h  a) C! ?+ R
' u% a- {+ y. @' _8 Y1 \+ F' d5 dclass Solution {0 A3 G6 g" e; m; x* a
   public int minimumOperations(int[] nums, int start, int goal) {( g& z4 \" t7 d+ U9 R5 k2 {
       int[] min = new int[2001];
! y; L* ^& Y9 X; ~       Arrays.fill(min, 0x7fffffff);
, g5 G+ l0 ^& Q3 i! a" M9 C       min[start + 1000] = 0;
4 f+ E- P- m  e/ ^) C; l* h       LinkedList<Integer> queue = new LinkedList<>();
( l) C' i. W& o       queue.add(start);
1 r$ x2 ^) P, X6 b       while (!queue.isEmpty()) {
. S+ e" [$ C; W. T% U- [* ^           int cur = queue.poll();# s5 ~" v1 ^, P  {
           int dis = min[cur + 1000] + 1;% S3 D  S# k- O0 m5 Q, ]
           for (int i : nums) {4 `. _2 G8 @. N- ?9 t
               int nxt = cur + i;
# @' P, Q. U4 e/ l               if (nxt == goal) {% l/ M% F. ~, Z6 R
                   return dis;
$ ^4 s2 ?/ W. L- u3 K% Y              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
3 g* e4 A8 H! `6 M$ Y9 K) n                   min[nxt + 1000] = dis;
( X5 W$ X6 L, \0 _9 |                   queue.add(nxt);2 u; K5 t9 C; f, C( [
              }9 j6 ]4 S4 ~. N0 G: ]0 \
          }
% `5 J9 L' t: ~: j& p( q& A6 ]. l           for (int i : nums) {7 J* s6 l5 R2 n1 f' Y9 ~/ q! p& p
               int nxt = cur - i;
, o9 G$ o4 ~* K               if (nxt == goal) {7 c" T0 \! [% x; q( h9 y! f
                   return dis;
+ Z: _; ]9 R2 a( g- V) r3 R4 k              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {0 x8 z( N/ j) {
                   min[nxt + 1000] = dis;' S( O* q' B( E" [' J. n
                   queue.add(nxt);: v" m& `6 a3 c1 @8 X# E2 P$ z
              }
2 n/ q1 m0 h# W3 I6 O- j          }
. G% q. f0 u5 U3 H4 {           for (int i : nums) {, D3 G/ I. `. j
               int nxt = cur ^ i;& k! I4 u) d' t7 S3 _
               if (nxt == goal) {
) j: c* R  a( T" p0 |                   return dis;
9 p2 X1 M9 Q1 r  ?              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
# a/ y+ L; J$ Q- L8 Y, `8 v0 U5 L                   min[nxt + 1000] = dis;
$ g8 S9 H$ u/ `/ B3 w; M                   queue.add(nxt);
/ j, c1 s5 ~1 p, G              }
3 U7 Q' g" @# h( i5 C          }. P! h$ c. u" w$ P" j" `& U5 e
      }* t! k, u) @2 C. q
       return -1;8 f5 r  S6 {( o" F2 E  j- m1 K
  }
2 a5 `1 w( Z8 u' D. U. B}
7 ~( M" F2 A6 \/ p1 ^) D  q* a3 J) Z# g1 X7 P1 d. m$ N! Y
【 NO.4 同源字符串检测】
( [' r/ d. M3 f+ R解题思路- [3 @* F; A( }6 n$ S5 a
动态规划,细节见注释。
' {5 l4 v/ R& p. r+ ^0 C0 O1 M: O9 r/ G) K( {! ?& M# S
代码展示& o% h. |6 z+ x
: y$ _. v0 _+ p
class Solution {! n) g/ I/ N% L4 j' |7 o7 M+ m8 T
   public boolean possiblyEquals(String s1, String s2) {; W' U3 ~  A! H: a2 c" {
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差
* B) u0 H3 O8 Q       Set<Integer>[][] f = new Set[41][41];% K8 Z8 h& W; B3 z$ r- Q
       for (int i = 0; i <= 40; i++) {8 Z/ f3 z( e  \  _- m
           for (int j = 0; j <= 40; j++) {
9 O% h- s1 l, S3 A6 g* M% A' l  w" H               f[i][j] = new HashSet<>();+ u! G$ M3 \2 V
          }
+ l3 R) X4 z. b      }: Y2 j7 @8 ]8 Z: K2 e% {' j+ l
       int n = s1.length();
: X1 p' k: {8 @8 K0 [. x- o( N       int m = s2.length();  _2 `) f( {5 w, l6 Q% d# j
       f[0][0].add(0); // 初始化 f[0][0] = {0}
/ D  n1 l. G! S% n, J. a       for (int i = 0; i <= n; i++) {
7 ^* e+ @8 W! X! d# p           for (int j = 0; j <= m; j++) {" G% E- B8 N7 R0 t2 B) ]7 u/ a
               for (Integer diff : f[i][j]) {
2 q' r- x8 `" Z! Z6 v% f4 L                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
# a6 `% I; m' z6 i+ c3 L                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {7 a( _# o- A; ^# q% k
                       f[i + 1][j].add(diff + 1);5 @$ m2 y* V7 M/ }4 H/ j
                  }4 n1 I# ^" y: S' }. f; _2 i. o. _
                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉, c1 V$ i4 _1 ]$ V
                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {
1 a/ H- X' ]: R0 I                       f[i][j + 1].add(diff - 1);3 w; d$ m% c* ?9 {: G' V# P
                  }& ^* Q2 Q6 D( C. H: |  i
                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)3 V/ ^  H7 P0 J' H
                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {0 W( D2 X! u  i8 z( @& E, {
                       f[i + 1][j + 1].add(0);
4 R1 L+ A# }+ j' ^" ~                  }9 E. e' b, M, S' e5 _+ E/ H
                   // 枚举 s1[i:] 的数字,加入到集合中* z2 d5 Q" f2 T  Q4 z$ _! a! M
                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
1 N2 o/ _! e! W1 p) C& ?                       p = p * 10 + (s1.charAt(o) - '0');" e3 ^. [1 ?- Q4 u9 S0 O# I/ D
                       f[o + 1][j].add(diff + p);( F! d" T" T* w; b/ r/ ^( u
                  }% I% B5 ~9 W9 W& P) Z7 T% q4 x! w2 q
                   // 枚举 s2[j:] 的数字,加入到集合中
7 Y6 j8 P; e3 \  G/ B6 I                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {5 t+ _1 `7 Y1 Q- {3 l# N4 n
                       p = p * 10 + (s2.charAt(o) - '0');& _0 `$ O/ [$ ?. |6 y# ?
                       f[i][o + 1].add(diff - p);
1 o) x, Y( h- ~2 F                  }
1 P$ v, G* c# L) ]" F& V1 S              }
+ }- X8 M, V$ y* O" Y) r7 p$ h          }
( b' @1 ~) Y2 d& g, x+ ?      }8 |2 ]4 D$ {- u
       return f[n][m].contains(0);7 [( G, B9 `# b5 `. w1 n
  }; q4 X% ~7 y( }, O8 v6 M
}$ D! ^1 s' Z$ V2 [- i
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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