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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 值相等的最小索引】
; z. I- J8 U( Z1 E$ o! N# N解题思路
0 {" J: b# e3 ^签到题。9 o- _2 G9 G$ E. f- [

+ V6 i7 h: K- u0 |3 i: \: ~代码展示- s3 ^( `$ M4 ?1 y

& z: \1 m% [* \& n/ mclass Solution {
& Z5 r9 y7 x$ y, s5 D   public int smallestEqual(int[] nums) {
5 N; r3 W9 O* {5 P6 X' _, F* D0 y       for (int i = 0; i < nums.length; i++) {& X3 q) ^% o* u+ M! T) o
           if (i % 10 == nums[i]) {7 R" W  P- J- F% \% x0 J
               return i;
- N8 E# q6 i& M" `          }% G2 h8 v, `- N
      }
9 y5 g7 {4 k' q2 _1 j2 C  ]       return -1;
1 i# b2 y+ g( [/ d" B  }
9 F4 F% E. Z# l$ }}7 i! w9 [3 ^) ~/ o( e
# N& R# g- K4 v, M( L+ d3 c8 z2 M
【 NO.2 找出临界点之间的最小和最大距离】& ]6 u- V9 a/ L: p" L* T/ Y
解题思路
& F2 v5 _2 K. R* l( P遍历链表即可。& u, ]7 \: D/ H9 t+ j

" K5 j5 P8 A6 x. g( S2 P% m代码展示
9 I, V* J- d( \* E. g1 ]( B8 v7 _% ~+ C- U1 ]$ f+ U/ [* C5 P
class Solution {
8 v  n4 F# {; p# J, |2 e   public int[] nodesBetweenCriticalPoints(ListNode head) {. o8 I2 e+ T5 Y) B7 F
       if (head.next == null) {
& x3 H$ h7 K* v/ p           return new int[]{-1, -1};
# ]* S. e, n$ |+ w      }
- R+ X& D5 ]8 p2 x3 O0 B2 s  A       List<Integer> pos = new ArrayList<>();
* @# j5 ~+ R  Q  \       int last = head.val;- _) Z1 _! B( W0 F
       int p = 1;7 t6 M& t) `9 p% o
       for (ListNode i = head.next; i.next != null; i = i.next) {3 v6 L. e* X$ _) J) C  X! L
           if (last < i.val && i.next.val < i.val) {
, s: q! S6 D7 y/ i* z               pos.add(p);
8 ~0 q$ `, a% Y  z2 l+ n/ l          } else if (i.val < last && i.val < i.next.val) {
6 W, @# K2 a( N2 n               pos.add(p);
( p! \& s1 _8 |8 \6 w% l          }) ~$ f# ?+ }& D' o& q  |3 W9 u
           last = i.val;; k: K& Z, S; h( g7 P4 w
           p++;
- S7 D( _7 h" [' _+ E$ D3 {      }2 L8 d5 L- Q7 n$ [% J
       if (pos.size() < 2) {
( D3 @- ~# p* P# y           return new int[]{-1, -1};
2 a! w% @" V& _# B9 l7 O1 X      }: N8 j, ]$ W; h1 a; d/ u  U5 a
       int[] res = new int[]{pos.get(1) - pos.get(0), pos.get(pos.size() - 1) - pos.get(0)};  h. J6 t, y6 }2 C! H; Q" p
       for (int i = 2; i < pos.size(); i++) {5 a+ C4 T' [7 ]0 [- n
           int dis = pos.get(i) - pos.get(i - 1);0 b" Y5 t$ {" D3 ?- H& \
           res[0] = Math.min(res[0], dis);* X, S- q* Y6 j& H; x
      }% |  T4 v' h' V( @3 u  T6 c3 _
       return res;
) A5 U' |6 \3 B% t  }
; R- m# n* e9 f; {}$ [+ x" k# L. ]  m# x0 y# b
9 E' I, g" [# c' A. F* d7 B* G
【 NO.3 转化数字的最小运算数】& z2 Z* ]- X  W" _
解题思路4 P& x* w) k+ @$ ?8 a; T* n- q
相当于 BFS 求最短路,为了提高运算速度,使用一个长度为 2001 的数组储存 [-1000, 1000] 范围内的数字,从 start 达到它们的最小步数。) E0 \- e1 O1 j
9 A- c& k" ]! [: p' M% w8 N5 _# m
因为题目规定,绝对值超过 1000 的数字不能继续运算,所以无需储存到达这些数字的最小步数。
3 K  C; C  y# J6 G5 ^- u% V" @
( M# d1 Z! g' J' `2 O% Y. n代码展示
/ r6 {) z: ~5 c' F: _
* B" K# E/ o# p+ Jclass Solution {
" @+ s0 I0 e, z/ j   public int minimumOperations(int[] nums, int start, int goal) {1 l6 e. b* D8 P
       int[] min = new int[2001];9 @5 x- @6 `  m0 K% r/ E
       Arrays.fill(min, 0x7fffffff);& |2 |% q: h9 A
       min[start + 1000] = 0;
* L( O" O+ v+ ^5 P1 ^+ j' k       LinkedList<Integer> queue = new LinkedList<>();+ O; e+ `- P  U
       queue.add(start);/ W8 q, n( N4 `+ P( ~9 U2 ~
       while (!queue.isEmpty()) {8 f1 r7 B1 t# w6 Q& G6 g
           int cur = queue.poll();4 k: C. I; z% R
           int dis = min[cur + 1000] + 1;
- V1 L: X4 y5 V! o) g5 B           for (int i : nums) {
; R  y% V1 N  P               int nxt = cur + i;
: P( E) h# `/ c/ B! t5 V1 ]# E               if (nxt == goal) {
- W& C% Q" Y. L+ {5 E2 @4 u/ h                   return dis;
. L8 h( |, p/ P/ Q. P              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
% ]5 n) I: k. J: e                   min[nxt + 1000] = dis;
4 B  C& r) D2 v: s* b9 S                   queue.add(nxt);
) W$ J* q" W0 B; z6 P/ B8 Z              }
. o$ x5 B0 Q3 j0 {6 a          }
$ e0 l2 n- d! c0 i$ n( @           for (int i : nums) {
" {2 W) c5 F  p7 y               int nxt = cur - i;
4 K# l2 K% ^& j: l3 n: Z               if (nxt == goal) {" l! [9 T4 d. B/ x' t( K
                   return dis;
# n7 g6 ^8 b; U( P              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
& n7 N8 H; Z) n( c( G                   min[nxt + 1000] = dis;
2 X0 ^9 n( f0 U/ c9 T9 V1 f5 p                   queue.add(nxt);' t( }2 ?) G4 H1 y
              }
9 o$ t; p0 j1 u: u          }# x2 O3 k% x* F+ [3 K
           for (int i : nums) {
  T6 u% w. H$ ~8 ~. ?% t5 @               int nxt = cur ^ i;
+ b4 M! v7 H6 n1 x* V, ?* ]. t# l: T               if (nxt == goal) {! I8 J+ W) l& p* N# z( I3 ?& M1 p
                   return dis;
( T5 j( o* y8 r3 K9 Z: B. M              } else if (Math.abs(nxt) <= 1000 && min[nxt + 1000] > dis) {
8 [) n8 Z' h; x/ [! w) J                   min[nxt + 1000] = dis;
; u+ I, ?8 }* r' H/ m                   queue.add(nxt);
* w2 b1 s1 i) Z% Q              }% v7 ?& I5 m& ?0 |* B- @6 Z3 v
          }
0 U& n' Z  }/ e4 {      }9 C6 I( r& ^3 t5 ^$ k- ~1 V& }8 C
       return -1;
& j5 p+ \) m. u1 k  }  j7 h& r4 T- k$ H; `$ j
}
' s$ _) w3 p) J; K! s5 |4 ~
6 m5 ~& M$ X5 }2 B' R/ L【 NO.4 同源字符串检测】
3 g* l' k) F: Y解题思路; S2 y+ X4 U: w2 ]  C
动态规划,细节见注释。
, H3 \0 |  F& W1 c9 Q
! r, Q7 e7 s' R+ I( ?2 t代码展示
8 O$ f) s7 j! z2 M3 ^8 C  a
, z) t2 y. I; f, ]4 o9 e/ a+ yclass Solution {
" l* v! g, d1 [0 K; v* H   public boolean possiblyEquals(String s1, String s2) {- p1 s4 m' z/ Z2 B
       // f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符匹配时可能的长度差4 Z; Z1 l9 i7 \5 G9 D5 j
       Set<Integer>[][] f = new Set[41][41];% w" y$ ^' f7 B2 B- ]0 r& {. `8 R
       for (int i = 0; i <= 40; i++) {
: U1 i: m" ~2 Z# _1 a3 y/ \           for (int j = 0; j <= 40; j++) {) w2 A& r9 i1 h1 b6 i
               f[i][j] = new HashSet<>();3 G- ?! y. N3 x0 N7 @
          }
9 R, @9 v3 ~) l: J" Q8 Y# R      }+ ^7 z  k; }2 W# K8 H. R
       int n = s1.length();2 l3 x+ `- |& o  {- K. k7 w
       int m = s2.length();
5 X' ~9 r; }5 l# ]( ~5 s& _9 I       f[0][0].add(0); // 初始化 f[0][0] = {0}
1 q6 H9 |7 E& r4 }       for (int i = 0; i <= n; i++) {
# `1 R4 x  c+ u: S           for (int j = 0; j <= m; j++) {
$ i- d' p$ x- r% I. q; @$ O5 E               for (Integer diff : f[i][j]) {5 H, n! @8 w3 Z$ k9 M1 b( L% [
                   // 当 s1[i] 为字母,且目前 s2 比 s1 长的时候,该字母可以直接被 s2 中的数字消化掉
' E+ w. c$ U# G# f5 U. t3 Q                   if (i < n && !Character.isDigit(s1.charAt(i)) && diff < 0) {: _, `9 M9 o+ d( _
                       f[i + 1][j].add(diff + 1);, {0 r; x& g( ^6 m/ n# d
                  }
) ]" W+ v- L" T, I" `: A                   // 当 s2[j] 为字母,且目前 s1 比 s2 长的时候,该字母可以直接被 s1 中的数字消化掉
+ d# k* T) n" i                   if (j < m && !Character.isDigit(s2.charAt(j)) && diff > 0) {; W& v8 E* G/ l* w8 v& T0 S
                       f[i][j + 1].add(diff - 1);
7 e1 c" J7 z3 y9 E3 j! E                  }
$ |0 U; L( F% J, U                   // 当 s1[i] == s2[j] 且都为字母时,必须完全匹配(即要求 diff == 0)
) t- F9 t1 D6 w0 e/ K2 P7 Q                   if (i < n && j < m && s1.charAt(i) == s2.charAt(j) && !Character.isDigit(s1.charAt(i)) && diff == 0) {5 D2 Y) e" m  _
                       f[i + 1][j + 1].add(0);$ A4 V1 ?  V% t2 K4 W+ K: a! k
                  }( T! R" N$ x' U& @" J% B9 ~
                   // 枚举 s1[i:] 的数字,加入到集合中; T, J8 a! A8 Y1 O+ w5 Q
                   for (int o = i, p = 0; o < n && Character.isDigit(s1.charAt(o)); o++) {
4 \. w( x1 i/ `* O: G3 C! m                       p = p * 10 + (s1.charAt(o) - '0');! |! S4 l9 N( Y0 \2 ?0 E
                       f[o + 1][j].add(diff + p);
. m2 X# m" x6 g                  }
7 X+ `2 ]4 Y+ l5 W5 M                   // 枚举 s2[j:] 的数字,加入到集合中
# {! _9 R- i. a2 V8 M& ]                   for (int o = j, p = 0; o < m && Character.isDigit(s2.charAt(o)); o++) {/ P' Y# H% u$ U& \
                       p = p * 10 + (s2.charAt(o) - '0');
( }6 u" {% p, z! N1 [, @( M6 k9 A' A                       f[i][o + 1].add(diff - p);
' j  c+ V* F# T/ J6 {7 z# T                  }
6 ^- i$ n! |3 k7 b' M: F/ `/ v              }- X! Z1 Q( |7 ~& n+ U. F
          }8 G# j. w2 d3 w
      }* P9 |/ P* S, I5 }8 b& m
       return f[n][m].contains(0);7 ]$ A+ c- t5 U: d. W1 m3 t1 U2 z) |
  }$ b7 P% Y  z* K) y( @8 L- r6 J
}7 m" ?2 [( e5 a& f7 k* `& O" u3 I
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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