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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】5 L" B( i( N- I5 y0 X

! c8 w! `! o9 p7 {' x& i解题思路
! E" l% Z# `2 X. N  N% T' Z& G7 n签到题,遍历一次即可。
4 @: {: g4 p: G: c
2 b  D+ f; E, m代码展示; l5 l0 i; U  Z5 C, x) ^

- j  C" g: N* {! G( J6 {* Jclass Solution {
- i( @! z* ^5 s/ ?% S* }: }. b2 H   public int countPoints(String rings) {
+ e  d, g9 b! C, e       boolean[][] color = new boolean[10][26];
% h2 b& e2 ~. m/ t& |       for (int i = 0; i < rings.length(); i += 2) {
( Z4 c1 v2 \6 r# D4 g           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;
' q; z5 j' D0 z      }0 t' Y+ M' K  ?6 g& k- A
       int result = 0;
6 T. A" {! s% n. e       for (int i = 0; i < 10; i++) {
7 Y: ?5 A2 J) U- [, U           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {
& [' K! r  _+ M               result++;$ o; R9 b4 m2 \! u) z
          }
- X/ n; D% N/ d3 `      }* ~/ B8 p( d8 V3 S; X
       return result;4 p: a$ `8 |: {) u
  }, @( _& x) T) ~4 Y7 B, ^& ]" M
}
+ p( U9 O; r$ n5 L! ~+ F: K4 S6 m$ u+ r
【 NO.2 子数组范围和】# `# [9 a% ~7 p5 K0 E1 s

/ D  w2 V3 }4 e6 v4 K解题思路
( Z& ^- Q0 l  ^) L* l9 c枚举所有子数组即可。) K, V; c3 I4 Z8 {" _

9 E3 b; p8 O  l4 f9 a+ o  A! I代码展示
  w3 T0 A' h/ y5 P: l& W- Q% U7 Z, R% M8 R
class Solution {5 ~5 }- O8 R( B+ [6 C0 L
   public long subArrayRanges(int[] nums) {5 I( e5 ?. m) a' [( o+ E& S. F
       long result = 0;
8 o; j2 h. R5 h5 `6 q4 L: P: G6 J       for (int i = 0; i < nums.length; i++) {/ e8 F- ?7 x$ }+ w5 J
           int min = nums[i];
; i! V9 j4 p4 `6 e& t4 T           int max = nums[i];  @) C! t) [5 i3 h
           for (int j = i + 1; j < nums.length; j++) {. s; j, N9 B7 j1 Y
               min = Math.min(min, nums[j]);
" Y. I3 G. ]# U6 r' p3 E# v               max = Math.max(max, nums[j]);
2 c8 G) t+ ^3 ^1 {. ~               result += max - min;3 q$ k  Q6 p. v6 j
          }) H) Q6 f# q. h* C  ?  Y0 |5 H
      }. X4 x1 e0 C! B/ U3 t$ W
       return result;+ V2 k$ [& o2 G6 z+ \$ }" s' r
  }
$ o% ~6 z$ n# o8 v9 ^0 w+ a' N}. g) T1 R5 p) d& G! ~0 ~: x+ g
( z5 L# d# g* @9 b

# [  `! x3 d7 k0 |8 s2 F. v【 NO.3 给植物浇水 II】4 `7 n1 I8 p6 i: q2 @1 I. t

: v  c: J) Q- y$ A解题思路" n9 b: }$ I! U9 X' I
模拟即可。0 Z, Y( M" u8 Q. A6 M/ ~$ f- Q  r

6 w/ I4 Y! `3 Y' Z% C: x代码展示5 e1 p  p' k. h  X8 n

# u1 J- ^) f+ V& v. ]class Solution {
/ B3 l  ]$ A/ z! M   public int minimumRefill(int[] plants, int capacityA, int capacityB) {8 E. g3 p& r# g* {( h) m
       int result = 0;
- a+ j& E2 k5 J2 `1 p       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {
8 a! [. E$ T# b$ |: f5 F           if (i == j) {
+ f+ f; t) G! L& e6 \! L& A# ~               int c = Math.max(a, b);" a! L9 i# ]( U  M$ D
               if (c < plants[i]) {7 Z3 C9 R$ V5 U8 k$ x! o
                   result++;
9 Y: v, Q/ T% s2 {              }
. a4 `2 O) D  o7 A: v0 I- L               break;
/ G% b; `9 ^& Q; F- r          }! V' |# {. ?* d) S3 D  }& l0 C' `3 K
           if (a < plants[i]) {
# H2 }+ K8 y+ d: Y  ~               a = capacityA;
5 z' h& v" E; o9 g               result++;
; |: Q) ?5 A% B' V          }* v6 I0 l+ B, {/ R
           a -= plants[i];
7 n& n1 ~, j$ x           if (b < plants[j]) {
  T5 f4 k2 ?8 ^- [' `$ ^               b = capacityB;
7 E% F3 n6 v" Z/ E/ l               result++;
; r+ d$ O) B5 m1 Q1 }: i          }7 ~& G7 k# b' U( H* i
           b -= plants[j];% e: {# Z9 o5 v1 E
      }2 }/ h$ h5 c' w# @' J# S
       return result;2 Z( R) j1 x4 Z3 d. }0 r
  }
6 R  L' T0 O4 r3 T2 y; C7 d& U# c}
& R3 }$ V" [7 H; u7 L3 e( K: O' n$ t9 G* p/ F
( P5 S, C/ O6 P" _5 g" W3 ]- u" O
【 NO.4 摘水果】
8 m4 I2 B+ N% e6 |8 n/ E$ y
, {$ J4 q2 J  p4 ^- q8 y, d1 y& \解题思路
$ I2 ]! S, h" L2 z; m9 i我们不可能来回反复走,只会有以下四种策略:; e) L5 e. U1 ^" ~$ T

$ c# J0 ?/ n2 L从 startPos 一直往左走 k 步
+ X$ o, n# `" N1 k/ H2 f1 \) F4 O& y: |# j
从 startPos 一直往右走 k 步
  n9 o* t4 w. ?) V8 U/ C2 v) Y8 Z0 M5 a- a4 g# q5 H3 m- z
从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步
+ M9 Y2 U2 y- W1 z& Z2 ]; m3 H) X5 Z1 f% g5 @& O
从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步% i" h( Z  _' d3 p8 v6 Q5 u' |1 N
) t$ Z; U; z+ e* z; ]- `
1、2 均可一次性求出来,3、4 需要枚举折返点。
6 ]; b* I+ j9 a9 g2 P3 P# o9 C( H( `# v
整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。
* @" X8 a" I. s, ]
/ E- i! J# F" K2 D) b代码展示
  s( v+ \) _! b6 `
: y- f' P" \; @9 Iclass Solution {$ }" P% {# P/ n8 [' z6 ], I. ^
   public int maxTotalFruits(int[][] fruits, int startPos, int k) {) D2 B) ]" A* }/ H! |: a
       int[] preSum = new int[fruits.length];
$ z; g: o$ m7 u9 l9 G$ V       preSum[0] = fruits[0][1];
$ u2 i* ?, y1 L% e       for (int i = 1; i < preSum.length; i++) {
7 s  @: G& \' T5 f           preSum[i] = preSum[i - 1] + fruits[i][1];  X, @6 L9 d, D8 _0 x7 D4 I
      }
6 d& V* r, O- t( `: o) c5 u$ G
* u" P( Z6 N: x# v, O+ l1 Q, [5 `       // 1. 一直往左走
  J. Q1 g2 Y# u       // 2. 一直往右走2 {: N; k; I, ~6 f
       // 3. 往左走到某个点折返,然后一直往右走
4 d$ ^0 }$ T  f" K1 @       // 4. 往右走到某个点折返,然后一直往左走
5 Y$ @: z4 U( Z- {2 H7 R       int result = 0;
1 ]8 r( ^1 S3 `7 h' R$ m! [       for (int i = 0; i < fruits.length; i++) {
$ Z7 D' [4 D. e           if (k < Math.abs(startPos - fruits[i][0])) {) u3 z2 `$ ^$ H1 U, |1 L
               continue;0 N+ f. S7 F1 L  z% j$ s: b4 ?
          }' o2 q0 U+ T& D4 y, d' k
           // 折返点是 i
) I' ?- g- n  M' g           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));7 H" u6 v. @, g/ A. f& G
      }
7 T6 e/ E& `% x* M( E       return result;: ^- i  n& C8 T& l0 R
  }
4 E6 N" e- u& k
( S& D! ?% |5 v, [* R5 S/ T: g' {; P   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {3 N7 I1 n' J) n+ _6 \
       // 1. 一直往左走* [5 k. M3 C  [  Y9 }
       int step = 1, idx = startIdx;% i# n7 C* z+ c/ q
       while (step > 0) {# t1 Y* V* Q$ l0 a0 u
           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {2 y1 B) M1 j) W5 ?! d7 m; x
               step /= 2;2 o; M" w0 o1 e3 |+ T4 `0 T; q+ Z
               continue;
6 f6 U0 [7 u' r3 h          }0 }+ N! n+ W5 T7 D- a* F
           idx -= step;2 x* N1 O* u  Q5 k  ]+ B5 ^/ w, a
           step *= 2;
4 K8 _0 `6 @) {3 F1 u      }* T! j$ d% ]- ]; L; i; @
       int allLeft = preSum[startIdx];5 |8 V, F2 e5 z+ B0 _# p+ P' j
       if (idx > 0) {9 b" ?# \3 f9 V$ d# x: k
           allLeft -= preSum[idx - 1];9 _& v. Z% N% x: j  L+ T" z# Y
      }% {1 y- o; x: u
       // 2. 一直往右走. ~" V9 Q# d  z, y, y' L; ?
       step = 1;
& h) N5 i* M, C* {9 ^5 x, O       idx = startIdx;0 e( Z) D+ ?( n, P& u; V- u
       while (step > 0) {
$ Z) |8 e7 e5 b3 n; u           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {' p0 L" l- Q1 f8 R; l, H# z
               step /= 2;8 z, o: v8 g6 a& ~# F, G$ N( q
               continue;/ I- A2 ~6 K' n
          }
/ Y$ u4 G( d4 ]" Y+ N( ?" w- r           idx += step;
3 ]  c  o6 D% Z" }- l( Q$ [           step *= 2;
8 f( m9 b8 O. E7 y: K1 x+ T      }
- W8 J* i1 v# n& ]# M       int allRight = preSum[idx];% f3 ~. r) n: l: C/ v
       if (startIdx > 0) {
3 J1 X7 ?) q+ K9 C1 s' l           allRight -= preSum[startIdx - 1];/ G9 N4 O7 p4 [( B) B
      }1 e7 P8 F& ]- F' [2 q
       return Math.max(allLeft, allRight);# J" K" l* l3 ]
  }( E* ?  o, L) g2 o1 |: L8 x
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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