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

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

上岸算法 回复:0 | 查看:2569 | 发表于 2021-12-12 22:20:14 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】
4 A( V# S  f+ S8 F4 f5 p+ _: v4 }0 B7 V! d/ K3 }9 ~: W2 h! f
解题思路
. p' }' Z  ~2 m' H2 P( w. @签到题,遍历一次即可。' b9 }, f5 L7 ]' p! f

. S$ k$ ]5 [6 w( p# t5 W+ G代码展示
7 c& {  B/ H. f+ L4 c9 b" C
: P3 P* Y" H0 qclass Solution {3 f) `' `- N% t; q
   public int countPoints(String rings) {5 t& f. }7 c8 [* t2 o$ j( c
       boolean[][] color = new boolean[10][26];
* d. S( \/ K! r( V       for (int i = 0; i < rings.length(); i += 2) {6 d- _9 M! Y9 Y, i4 p; N2 x2 w" l
           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;' m0 O% f+ ]6 |* R) X/ `
      }# I* V: P' j  x0 y" M: x
       int result = 0;! X0 w( I1 }8 x& q  f- A: E
       for (int i = 0; i < 10; i++) {# w$ |; y4 i( B* N) r0 Q$ ^
           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {& X8 O' U3 s$ l/ p
               result++;
) u, x* q- V$ G' X) u  [2 X          }1 g( c$ u1 L0 {8 A) ?2 A$ s7 T
      }
2 S' f0 B& n9 D5 J       return result;" h" d4 k2 a1 L- M
  }- S9 x; N3 Z& @' x, l; o
}
1 w& U5 I. v- p% [" q$ x  _. T  h
【 NO.2 子数组范围和】
, }1 v& B2 I; N7 l) j8 o  ^! r% e4 ^& C. ?
解题思路
- C3 F1 p$ y+ S) ]! S2 E枚举所有子数组即可。
% y- p1 V* T' p
% Q' i2 q3 E4 e2 O, X4 l代码展示- ]. C4 E3 C8 D' R

+ c, p' ~- h) x2 `class Solution {
1 G- C$ m( D& k2 U1 h8 l- ?3 J! Q   public long subArrayRanges(int[] nums) {& K  j3 H7 V3 @* S: \9 M; }, C
       long result = 0;4 j/ }  E  `/ n; ^- \& F% I
       for (int i = 0; i < nums.length; i++) {: N; {: f* K2 `; F5 w
           int min = nums[i];
( `. i- z; a7 d8 {8 G) m% e# B           int max = nums[i];
1 z+ k% f. b: H0 v0 i           for (int j = i + 1; j < nums.length; j++) {
1 p" u* S& r7 a6 x1 \. v$ T               min = Math.min(min, nums[j]);/ o+ I8 [2 ?8 \
               max = Math.max(max, nums[j]);) m  {9 L  b+ f& ]) d  G- z
               result += max - min;1 V$ r% a# X8 J1 m& p" s
          }) `- Y( V9 B5 P
      }
6 w7 K$ e7 R- f. L6 \4 N       return result;
0 K" D8 p3 E' \& p  }. J6 G0 P* Z4 i& J1 ~5 r8 u
}
. |; b' h* D+ R7 c2 S0 \
% e; Y' A8 `6 h. D  |1 K5 ~2 F+ D# k6 t' [
【 NO.3 给植物浇水 II】: M. f- {1 W) Y* `# n
4 }5 l: z% |5 I' b
解题思路! Y- \! k/ ]( Q, \, P' s
模拟即可。
9 ~0 E2 E' w& f
- {9 ~. k+ e: S7 z代码展示9 `1 R: G8 r% G, u  s0 G% y) x) X

/ x( \6 h4 x5 V7 N' y7 [class Solution {) q# a0 O  c$ r) D$ y
   public int minimumRefill(int[] plants, int capacityA, int capacityB) {8 c9 }# ]; Z* s8 ]5 t
       int result = 0;* h. `7 w& z! r* y7 g: q, ?
       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {# ]. P+ }& `9 A- ~2 @/ m6 B
           if (i == j) {% H$ Y2 f/ b8 F+ X9 k
               int c = Math.max(a, b);
, @4 A$ C9 ?9 L5 m1 C, j; t9 X               if (c < plants[i]) {3 y, `4 ]) i; _4 n
                   result++;! |& s2 y/ T2 Y* u4 f* o
              }
3 P6 O7 \! Q! w+ ]3 Y- u- M               break;3 O/ L1 L3 K7 R, x/ c
          }8 o+ a5 e: g8 }" ^; }& C9 _0 j
           if (a < plants[i]) {
) q& Z5 K: c, n* _               a = capacityA;7 D( z# J; C4 R7 H3 [7 E4 I  \
               result++;
3 B- Q/ }7 C% G, b: o6 e          }
  {+ _  {& c6 N7 y  @. c           a -= plants[i];
) d) q1 Y9 {  c! n% F           if (b < plants[j]) {5 L. B3 X2 E; y! }7 m
               b = capacityB;
, F2 P+ T# {, V" H9 Y1 U               result++;
( n, Y5 Q! w; }          }
, _- p- e7 m) e           b -= plants[j];6 R2 A& W& ^; Q4 o
      }
3 ^% k. A. R. U) k7 ]& W       return result;
3 l# F0 w7 M. N  }8 R$ o% B3 u1 D$ X
}  y2 C- H+ b8 A) o6 s0 r; _! H

+ B7 c2 j2 ^/ F1 E; e: ?' Z7 R' v; I7 l# }6 x3 ?
【 NO.4 摘水果】5 ]2 x9 L8 s% ^1 r: L. _2 W; _. n
3 m+ R8 N: }. v, X% D2 n3 [
解题思路
* w0 z5 |; }* {0 }我们不可能来回反复走,只会有以下四种策略:! Q3 b8 S0 D8 [  w% q" ^+ _0 E% k
# Q$ j' B7 g9 y8 a
从 startPos 一直往左走 k 步
! h) Q% G  ^4 f) J. N1 i9 v2 L( y0 @* }0 e9 k1 r: [
从 startPos 一直往右走 k 步+ b! y- W( i3 ^. S
6 U! G2 D) ~) s1 h3 j! Y! W
从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步
; {4 O# v' e, s' t# j. t0 b8 }( H6 S7 j7 ^# f
从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步
2 Q5 E3 s4 \9 |! G2 _0 `
! ^# v0 K# r: x% H! q9 K' @( ]; N1、2 均可一次性求出来,3、4 需要枚举折返点。
8 Z( l- ?4 r1 j' u4 T
" R- m  f; D; s! h1 a整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。
/ [$ @% f" u4 e+ \/ {
1 W1 _' S3 i$ l3 z$ f( v6 O代码展示; V$ @  M9 c3 X
7 Z0 M+ n1 X0 Y- \
class Solution {
1 p+ g. O! u8 h) ?- E  W  Q   public int maxTotalFruits(int[][] fruits, int startPos, int k) {
; y( L# B* G9 b6 G% u! S0 v" e       int[] preSum = new int[fruits.length];
5 U# O+ B* B" H& S! Q       preSum[0] = fruits[0][1];
5 C/ {2 i  M  T/ I       for (int i = 1; i < preSum.length; i++) {6 B4 H# G1 s' k; R1 H
           preSum[i] = preSum[i - 1] + fruits[i][1];9 C: p0 J: w8 E6 D  R
      }
& k8 j8 {- b+ _' s2 {) l0 ]7 z$ P$ [  i: D1 l4 i: P3 e5 ^
       // 1. 一直往左走6 K: K' {  T! A" R- |/ `
       // 2. 一直往右走
3 D5 p8 G$ n/ L: l       // 3. 往左走到某个点折返,然后一直往右走
' g7 m' d( P% c       // 4. 往右走到某个点折返,然后一直往左走3 q. k( O  @; T
       int result = 0;1 W( c( F! Q2 J% }. o
       for (int i = 0; i < fruits.length; i++) {
6 Y5 x1 Y. C9 ~+ q3 c0 C8 Q0 k           if (k < Math.abs(startPos - fruits[i][0])) {
9 I: A! }$ N' V2 _               continue;
! g: w2 _. l. k7 ?0 a5 }          }+ x/ F) h. k0 }" m2 M1 w; T/ L
           // 折返点是 i/ O2 B6 ~6 D# F$ ?% |
           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));
( D# S2 ~: Y& A( ~9 u      }9 `" E0 z5 j9 `0 \
       return result;7 f9 X' ^7 Y% ?0 I* p, _7 a' ]
  }
/ l$ K/ Q$ I3 r+ E
  U( g1 C7 c/ o8 u7 S$ _; z   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {
0 I( t5 E+ L- N& O: N$ _$ H4 K       // 1. 一直往左走) F8 L1 V# d0 T- r  ~  `
       int step = 1, idx = startIdx;, v) [* I9 a) `) ~
       while (step > 0) {: Z: A, X3 ], Y. g5 ~; S, x
           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {
8 t: v2 L3 e) I' H0 l) T               step /= 2;
( A3 A; {) G# D% E7 }5 T               continue;, ~, W% d4 `8 e' m9 l4 t7 n
          }0 f6 N$ U7 v* P  z& b' Z; T# e  P
           idx -= step;
, [$ i! b$ |; P+ K           step *= 2;  i7 K7 l3 r0 g; {1 p. \
      }
5 F$ t- |& H, @  R* }8 W       int allLeft = preSum[startIdx];  ^7 m2 l6 F+ A/ h
       if (idx > 0) {6 Y1 p  T0 k3 M" c
           allLeft -= preSum[idx - 1];  h! P. C: }3 z
      }
" N# H* L& ]: B; W       // 2. 一直往右走: N2 @. V1 e  p7 h$ z4 b6 I1 Y
       step = 1;/ w& A5 q* w* ~, X# L5 t6 K
       idx = startIdx;, }$ s, i# ~5 D8 h+ k
       while (step > 0) {0 k4 g8 n# |: F
           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
% H. o( ]  E+ a4 j: u2 z               step /= 2;
; O8 D9 f( R6 S- t               continue;
# i" [& p1 [# n2 j. h. c" K# b          }: {! g+ V0 ]. G5 v' L; H
           idx += step;  e( D% p; g# b+ R1 W" _8 b& y9 e
           step *= 2;
" t; ~6 q( o5 |6 h      }
' w7 |' Y/ ^" q8 y  x8 N; }       int allRight = preSum[idx];  `; u) m4 V1 a
       if (startIdx > 0) {" b  K% E9 X5 f; a6 I6 w
           allRight -= preSum[startIdx - 1];* [3 C6 [: a! z0 f
      }
+ D4 P3 @" \% h8 K: C# ~! `0 S1 d/ d       return Math.max(allLeft, allRight);
' q1 ~" J1 [( ?4 F& H  }0 K1 U3 j2 }; {2 g) e
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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