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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】: @0 v) a3 H: V, @/ Z0 }, O

. ^8 R9 }- c+ q  P- L+ r  z+ {解题思路
8 N: L1 z( P' Y# b$ @7 _签到题,遍历一次即可。9 b9 Y2 O% c0 r" |
/ I, E5 r. j: b
代码展示  L0 U& y$ A5 g/ ?$ m% \/ O( W) N

/ u4 I( t0 o3 }+ Pclass Solution {
2 _3 J/ K1 a, w% T) p6 G7 Z   public int countPoints(String rings) {2 b) n& k: L/ M7 c% j
       boolean[][] color = new boolean[10][26];2 T! T) K: O8 j9 [
       for (int i = 0; i < rings.length(); i += 2) {! F" [- ]2 q3 l+ K5 s
           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;
. }' L: z6 `$ m% j5 A      }
4 W  W8 n, h8 ~       int result = 0;9 ^7 F+ _* P* d* h: K1 ]6 `
       for (int i = 0; i < 10; i++) {
( A, b3 ~9 C: q6 ?           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {+ s. J5 {8 i; y# v
               result++;
9 R& x; s- Y. e* y          }$ \7 ~5 R  Y' ]/ T
      }  K' b& N6 S* o. i
       return result;
  }0 O" y2 z" d; M' Q# H9 E, y  }" z/ w9 H4 z3 G7 {( h4 \8 \
}6 y0 ]; X* ^4 ^( V4 F. L$ K

+ s2 X" f  f; A: Y( O0 d# J【 NO.2 子数组范围和】
: W. ^4 `$ a1 B- I( J. H% u+ _3 Q3 R0 T. l, y$ o/ D+ k" G( H5 m
解题思路/ E$ `% P) q5 b1 g
枚举所有子数组即可。0 t! f( `7 `. i# M( v: F$ G

0 X6 C& h! T; ?3 Q5 |代码展示
- _+ `9 L$ Q+ n- d* W6 N, N& p: o, O5 Y5 S' P) |$ h/ K7 J! P
class Solution {3 `. b7 `' m4 p( i, ?
   public long subArrayRanges(int[] nums) {7 Q& E/ h. T8 j9 W) u' V7 S
       long result = 0;
: w+ y3 X$ Z. m/ \0 d9 ^6 t       for (int i = 0; i < nums.length; i++) {
1 n9 z& k! k3 ~6 d( h6 {2 W+ h, R           int min = nums[i];
- @/ m) F- H+ a% O. l8 o. V* m1 w' r" m           int max = nums[i];, k% n/ _, E2 [% Y; B( X
           for (int j = i + 1; j < nums.length; j++) {, B9 g2 J+ G4 h
               min = Math.min(min, nums[j]);; E4 S7 ~  K. g% j6 Z& ^
               max = Math.max(max, nums[j]);$ N1 |( e7 J4 b: J1 W
               result += max - min;
. w9 n6 g0 W4 _: R. x" u2 f3 k          }2 [7 }7 P7 R( w8 `
      }3 v% @- H0 X! y
       return result;
' h' }% u2 U' Q! S  }
9 h" L# ]* U% Q* p& c5 \, P1 ]}
$ E4 G  k0 y$ H- B
2 x. i  O- D0 s. b8 N* R
/ R, v1 j! k7 d/ u% e$ q1 L【 NO.3 给植物浇水 II】
( h( M2 N4 |" Z7 P5 P) V. y
3 |# o/ e0 m6 `解题思路
8 y' N" x- h; P模拟即可。
2 c( Z% ?9 T1 ?- c
, P, D. H) Y+ J3 V代码展示
% z; L( L/ q) O, `, ?
; y6 n% V$ S. n6 S' Wclass Solution {
# K# d; P$ z& ]+ ~5 w) i   public int minimumRefill(int[] plants, int capacityA, int capacityB) {7 t& ~0 X. G' e+ n6 d, k- h
       int result = 0;- k$ j0 g4 p- r# `
       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {
) S+ x' q7 O% F% U% Y5 X           if (i == j) {, k; p: D! l  Z7 i& q# V9 o& i* M
               int c = Math.max(a, b);
- R1 _0 l& c/ s' d8 K9 ?1 Z               if (c < plants[i]) {
2 Q3 S9 w7 x& H                   result++;, O+ |6 [/ s; o' x) Q; L5 i! K+ X
              }/ N$ {! C5 @$ q; |3 r3 A. j/ ?
               break;
2 C/ Z7 j8 S1 ^7 z. i0 S          }
0 s- q& Y5 t* n3 A- S- x           if (a < plants[i]) {6 g9 J/ N3 ~4 G7 ^/ S' p1 s3 ~
               a = capacityA;
  ]8 h5 D% ^7 H4 e# p# {               result++;
/ `, _1 K9 b, {, K3 c6 T          }( P1 h" h) \6 \
           a -= plants[i];" T! F1 S& O$ }) b" G) i
           if (b < plants[j]) {8 D8 k; A, k9 y0 Z  d$ F
               b = capacityB;: N/ h8 F. ]' n2 C
               result++;# [3 P2 O% `2 t. N
          }" q- P9 O& j6 g, R9 f$ E
           b -= plants[j];+ ]4 K0 H5 [( q, t# L( k3 V
      }; q+ M; S0 s6 {& U8 p
       return result;$ Y) L( u, k8 `! J
  }) T3 F$ L! d, A8 Z5 r! g1 M3 {& s
}
7 c* k2 B% P: \. Q, o
1 c9 r" [! H9 w& X% w9 v! W# z1 W8 o- A* t9 |
【 NO.4 摘水果】
" \+ R9 }" o7 {  C' i; R3 E$ G; c. E5 ]' e" h- ]9 v1 {1 v9 \7 Y
解题思路
( Q# P$ K  b7 C  r- Y我们不可能来回反复走,只会有以下四种策略:
* F/ m. c, R$ G" I( c1 D& A$ ^: _! Q2 d3 S
从 startPos 一直往左走 k 步
- e. b4 b( m# n1 }1 }, c
2 w) X$ b3 w9 G) r从 startPos 一直往右走 k 步
* j9 O8 y6 I, d& l2 }5 ^9 D0 ]( y4 a4 [* k4 W& E# K( o3 r, z
从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步2 ^1 w" f3 v. b  q
6 @2 B8 K- n; o# j. ^  L3 \6 s
从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步& {6 P- \& K+ n! Y
! h- R5 O  S& B
1、2 均可一次性求出来,3、4 需要枚举折返点。
. _4 S9 O% M# b: w4 ~% f" \9 _- i" H* w
整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。
- ]; F: i: [$ Q$ M2 x" j/ U6 {8 }! p# ?  ~$ U
代码展示
, `$ _2 I1 v8 c$ Q* c7 R! ]9 v" m$ }9 s
class Solution {
0 |: F" v+ w; C   public int maxTotalFruits(int[][] fruits, int startPos, int k) {
: @+ T7 n% y1 U5 Y) k7 H6 O, @       int[] preSum = new int[fruits.length];
6 c. D& V* h8 A3 v5 I7 P/ K       preSum[0] = fruits[0][1];% r9 |4 l& w. U1 ?
       for (int i = 1; i < preSum.length; i++) {
+ G- y: y/ H5 p: s: D, |! ^4 }           preSum[i] = preSum[i - 1] + fruits[i][1];3 ^* e9 b5 f8 R3 w
      }
& y/ p& i* V2 l; K! `" q, A! a+ W- z. C% P
       // 1. 一直往左走* ~1 H% t0 E1 [$ e# H
       // 2. 一直往右走( h# G9 n+ L/ F' @  C
       // 3. 往左走到某个点折返,然后一直往右走6 u0 J' s. d3 _2 h9 _5 ]
       // 4. 往右走到某个点折返,然后一直往左走( D3 t) \# a7 S. z' W. r1 B$ `
       int result = 0;
) I: m, e6 I# O8 q6 w9 k; z       for (int i = 0; i < fruits.length; i++) {% k5 `$ `& \# r, k& N
           if (k < Math.abs(startPos - fruits[i][0])) {9 X) Z3 y8 e/ K3 |$ j; f! x8 q
               continue;' D7 a: K9 P3 o( {
          }% |1 T, X  L) I- m( Y' i8 I
           // 折返点是 i
" [0 y6 n% q2 j7 d. S8 n1 ~) g1 x           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));
, S* ?2 P" T" T: |/ Z3 _1 |      }
! j4 {" I# R3 t2 B" N       return result;
+ c' s9 C! ]) y! z+ x3 M9 g  }
. Z- A- k1 g  e3 K% Y0 \/ R# `: m
" T+ ~. b, V5 n+ N   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {# L: I8 T" J, P5 D0 j
       // 1. 一直往左走
1 {4 v! h  \$ c) F  `! S       int step = 1, idx = startIdx;' A$ G) o4 K6 A; a) g4 o
       while (step > 0) {
0 ~" {9 l( Z( ^2 ]1 J$ X           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {% y8 D1 [7 d) {+ r/ Q9 {
               step /= 2;. ]: D* Z5 g7 ~
               continue;
. W2 J. G( s3 z2 J; F8 N3 c          }/ H" a0 ]( z& y+ j$ E  F- g
           idx -= step;
7 B5 G: m& N: Z( W, b           step *= 2;
! ?0 U1 A2 [. Q! F      }
* w7 K8 w- a# Z1 r$ t) M       int allLeft = preSum[startIdx];
) r; Y  f' v7 b4 I% J7 J9 S       if (idx > 0) {8 \. J1 u! X. m9 y; ]1 O( ]
           allLeft -= preSum[idx - 1];6 {. j+ }6 g9 c8 u( W, Y! `
      }9 e: c! L" B. L+ D
       // 2. 一直往右走% N& d. E1 j+ o1 \
       step = 1;3 Z0 Z% r) j8 |* M- b5 Y9 w& r
       idx = startIdx;
2 C: Q+ @2 j& r6 |3 e       while (step > 0) {
  p" Y' s3 ^! X* D# M+ T/ q           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
7 i% H) O# d* ^5 u6 H  u/ i5 s+ W+ }               step /= 2;- a: W9 f. X1 m( Q, W# N0 s
               continue;* v0 y6 Y4 r& z, N# q) R0 D
          }* s! q4 Q. s8 F0 Q5 x
           idx += step;
8 |. c! ^0 Z5 `0 A* W, I* e1 e, H           step *= 2;
8 _+ @& V6 ?$ d' P9 E" m" V      }
, o) s' }" Q3 [" V6 B- @       int allRight = preSum[idx];
9 ^4 `, P, p1 t  ]& n       if (startIdx > 0) {
/ ?2 p5 H6 {3 `           allRight -= preSum[startIdx - 1];# P- C: d# s) p4 p% A8 ~
      }5 l) u( R) o$ S
       return Math.max(allLeft, allRight);" ]7 L3 M  c( ~: J# ?
  }9 B4 I) @$ e6 S1 h
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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