找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】+ d/ x1 n# I" l. n2 I! s
" S& x& ^4 U# [' k' E+ G
解题思路
- x2 K8 F* ^8 d" W6 u0 w0 C$ ^签到题,遍历一次即可。" \- P8 b0 l) s* j  e  F

6 C( O$ J* O3 i1 o6 V代码展示8 q" T! o' N% l4 E
1 x. m1 N2 R' V
class Solution {8 N1 I# P; t, I% }+ d
   public int countPoints(String rings) {
+ O, p2 b+ {. B/ h( Y" t       boolean[][] color = new boolean[10][26];
. }' m8 }! U; C: b0 [9 s       for (int i = 0; i < rings.length(); i += 2) {$ f' B, M  p) C1 J6 u; a5 c$ n
           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;
6 \, A8 F& r; \' I+ i      }' A3 R& w& Q5 {" M" B) V1 u8 F
       int result = 0;( y! M$ ]9 X; N# A9 u) p' n0 p
       for (int i = 0; i < 10; i++) {+ d9 _' V0 ?0 D4 H+ k
           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {
6 [! Y% e" N5 {9 l" k, g! N               result++;; ^* X% f7 Q5 `& z
          }7 m. \2 Z  t7 ~( l- P7 x2 z
      }
8 V0 G, T  S, M  O" x; e       return result;
/ @# ~& j: ?. m" t# U, Z  }4 ]( W2 d8 L+ \
}% R- s2 Q/ O/ s: l  U
' L1 }6 X- w" ~0 \& M# @0 [
【 NO.2 子数组范围和】6 x3 ]& w2 j4 i3 c% `/ N" `
2 f4 H6 J: N6 h9 P1 l" D
解题思路6 G7 a; g6 `8 Z: ]0 d; u
枚举所有子数组即可。
7 f( O2 g* G1 C; k+ ~. [6 h
9 T' L, g! c. ?. |代码展示9 E+ E0 Q/ i" ]

5 S) X0 J3 X2 cclass Solution {. X* t& ?6 V" x2 {7 t
   public long subArrayRanges(int[] nums) {8 ]/ t# _& U+ A' Y! U+ R* e
       long result = 0;
* r: \) _  h. d) _/ M       for (int i = 0; i < nums.length; i++) {$ D% O" @; V2 ]/ K8 I2 o
           int min = nums[i];
3 V. c. ?  b6 R9 K' R1 v/ B: |1 j           int max = nums[i];% H( g# K" i3 D: c5 i
           for (int j = i + 1; j < nums.length; j++) {
  O" U: Z. b5 [0 v* {) _! }( `               min = Math.min(min, nums[j]);
( z4 |  t. U- k2 b               max = Math.max(max, nums[j]);
* D$ ^0 `* V2 C* h2 Q/ w& B               result += max - min;
! a! b- F. \  i' X+ Y4 s" b# V6 e$ K          }1 }! J1 y! F, `9 D5 F* l5 p
      }
) K" r$ X; k+ s+ n% m+ Z3 u$ _1 r       return result;9 |( e, _5 H. T: }; T$ }
  }
; E; _: ?( A& Z( @}  P0 W4 }" Y, b- ]3 B6 l" v
) b" ^$ t  b7 C8 k% {) S( n# _! }

0 ~7 I2 n4 O3 S2 I) i' v【 NO.3 给植物浇水 II】$ v: \* M4 A; I2 O& d

2 V! D- k5 N( _/ s& |& R+ a解题思路; c4 ]& w9 }$ {1 c  U- I( S
模拟即可。& z( [5 g5 b; ?

+ x: r" L( O% E3 [  R4 d代码展示
0 b6 U0 L) W+ G6 C+ J( J
( E4 R) J+ h/ S' N3 v- U1 ]class Solution {
+ W2 V& O5 Z+ r, p4 p8 ]" w( s- Q   public int minimumRefill(int[] plants, int capacityA, int capacityB) {
) q. B3 X2 e6 J& H+ z       int result = 0;
- C/ i. ~+ n* D; n. G. E4 _8 ?       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {
& q. K9 g9 C" ]' X3 s+ c: r           if (i == j) {
; ^1 [; R2 K; X1 L3 ]$ H" [               int c = Math.max(a, b);
  A7 t+ u* d8 Q               if (c < plants[i]) {' D. a( e& R% u7 m
                   result++;/ A' w8 z( @, t1 d5 y
              }7 l3 g: s) S3 T9 ~* ~2 X' r
               break;: B" l5 y0 f% L& ~% J+ ?8 x: @* B
          }% {: |" v2 z! u
           if (a < plants[i]) {" k& ^; |, `; E- p
               a = capacityA;
7 x/ I, \) C) N               result++;5 k' n" \! k/ e4 w* D
          }
) F3 z) ]' A* R8 q; A3 n9 `           a -= plants[i];
/ o4 j" V! B8 P, U8 w* k           if (b < plants[j]) {
% o& C3 F0 o1 ?. o1 b/ ~. w               b = capacityB;& w1 G7 y$ G8 U1 u" C" Y, ?3 j
               result++;7 k3 h: a' a# ~+ L
          }
5 S  H4 `. a* r           b -= plants[j];+ ^% U. l; J' t
      }
. e) `4 j: F- K6 w" B" N2 I6 `       return result;
# N* Q4 V% C# @1 m7 m/ @1 X5 F( e  }
6 |6 K) ^* {# K}" R$ p: P% T0 }/ S. q+ l' S2 D6 }

  p9 r) o' k* r! l9 G6 a/ f, B0 V9 P6 O5 j! r9 o
【 NO.4 摘水果】
! G- f8 ~4 M$ s# |7 N  p7 s8 ?+ E$ Z; e5 t: a% M8 }
解题思路$ o9 A) G0 u1 A* ]# V! l% T
我们不可能来回反复走,只会有以下四种策略:( t: p! A& X: h4 P- c# C6 s0 J) V
) ]) f7 ~+ V# d! g! d) n' f, E
从 startPos 一直往左走 k 步
5 O5 ?: `. S: O; P5 x7 u8 m4 s& u: I- I' v( t
从 startPos 一直往右走 k 步
. j% M: k; l/ v% T. B) U" Z% t  K
8 @3 P) B3 B9 Z/ g$ E4 y$ p4 w从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步1 B% L9 k8 s/ |& F; L

) h, S+ \' |- x- A5 ^" Z从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步3 `+ P) L/ K) e
5 p& g, \9 _, j$ ^- ?% S
1、2 均可一次性求出来,3、4 需要枚举折返点。! ~; D  M: g6 M: I

) N& c* |& P) H6 e- T( i0 E整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。
( h4 Q8 D% {: M, |  Q' n* G( P0 z( a" i* U( a% \2 k1 z5 ?
代码展示
' ^# U$ x5 _% W* ^- s6 j* `9 [- {* y, _0 e) }# A3 E$ `/ r" Z- y
class Solution {
( f3 \& I4 l- T' M; }5 D  y   public int maxTotalFruits(int[][] fruits, int startPos, int k) {
5 ^; c) P) t' |; c       int[] preSum = new int[fruits.length];/ l; A* _9 m7 n4 R$ B
       preSum[0] = fruits[0][1];
0 R9 z! t2 @' B7 P1 [& y! \) x       for (int i = 1; i < preSum.length; i++) {
8 `6 L: W4 D1 b' T           preSum[i] = preSum[i - 1] + fruits[i][1];
' ~/ S) L' G' D- t/ M      }2 B9 P% v0 j% A$ K3 l

& N& P) p2 v* }' x$ R* X& Y       // 1. 一直往左走
- q, ]% t( B+ ?% |       // 2. 一直往右走+ P6 ~+ q, S" a* i4 P9 w# c
       // 3. 往左走到某个点折返,然后一直往右走; U# H$ D+ ~/ ^  c# A  m
       // 4. 往右走到某个点折返,然后一直往左走: S$ h7 z7 T3 B& [. `2 K
       int result = 0;
9 W) j4 i" \& L" i       for (int i = 0; i < fruits.length; i++) {6 N$ R) l6 S5 z* W
           if (k < Math.abs(startPos - fruits[i][0])) {) D7 M, D' |" u% ~3 w/ p
               continue;4 A, T( H( {& u- A/ T( }& H
          }  `$ w1 C7 E. ?3 d& T4 k  L% Z
           // 折返点是 i
/ _$ S' v3 t. S( g& \5 N# c           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));9 M8 K& a; O  c1 L/ K
      }
2 }* N' h% F$ s6 ]7 s; }) n       return result;
# @7 B% N9 C; {! ~, R! C  }4 Q9 s5 t" K" E& R5 m+ z" D6 L' B
- Q2 f0 v5 F) }! {7 C% K/ r2 ?
   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {: y' Z" ]2 J8 ^% Y/ t8 P5 a
       // 1. 一直往左走
( N% f0 m3 k& V& Y* g( \- e       int step = 1, idx = startIdx;
9 t. H% _& @6 S8 Q; T6 ^. Z# `       while (step > 0) {
) h3 n# p0 v$ q, j. T$ f           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {1 @& X8 M4 [" J) b2 q
               step /= 2;
: `5 w  F- n8 h, o$ B7 n               continue;* U3 X+ J! F! g$ y- a# C. m% t
          }) A* d8 C  l- d; [9 e
           idx -= step;
: r5 c# R/ `. I, s5 E) T& F0 X  F           step *= 2;$ Z* S. U- Q, D
      }) \6 H: R$ d4 s# A! V' m
       int allLeft = preSum[startIdx];0 k) q" X3 u/ f4 h& h0 M; i
       if (idx > 0) {
3 T  C& w- S9 \; j           allLeft -= preSum[idx - 1];
6 s! S3 x6 h7 j5 ~      }6 ~9 e5 f% n9 L$ e
       // 2. 一直往右走
5 o1 O1 ^' i  j# g: D2 j       step = 1;
* [3 [% \# t) \: [       idx = startIdx;" y4 I* p1 H5 s" i9 ~1 l8 I
       while (step > 0) {/ M/ W8 E" B9 B3 s& \9 Y: J
           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
+ j7 y5 o: P5 i3 ^. q& s               step /= 2;
( ?: ]) h9 T: [  b; }) J               continue;
9 \" s; S- T/ n          }: d; J1 d& w: Y, E: p/ ^* ]
           idx += step;- l5 i5 R( k* b% g: N) n
           step *= 2;& ^* M/ @, Z9 l) z' ]3 `
      }
( B; t3 Q) c7 I$ T) k+ H2 y0 X       int allRight = preSum[idx];7 l; T; q" p5 u7 U8 @+ s1 R
       if (startIdx > 0) {
' C9 ~/ p* a5 b# ?( E. r7 ^6 W           allRight -= preSum[startIdx - 1];) G& c6 k; T) M0 G
      }) ?& e- T% |  ~* `5 i: f4 {5 v
       return Math.max(allLeft, allRight);1 `* X% q: s0 F" M$ {6 I( M
  }
% {2 d* n0 D7 \$ I* z2 u}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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