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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】
/ m3 k. ^# r) n4 W1 T
* N+ K% l0 _8 w解题思路
3 _, E' L- k8 k) |签到题,遍历一次即可。0 ^/ N" P* g8 a
  {! D2 \+ s5 g& v* W+ @: C
代码展示
& Y) X7 [! R3 p
) _5 D5 f1 e( T- y3 w* W; Y2 K' Kclass Solution {% B  ^& M5 P) q1 Q
   public int countPoints(String rings) {1 W1 D. g: N* m; D3 u
       boolean[][] color = new boolean[10][26];6 W0 m5 Z: V: [, v
       for (int i = 0; i < rings.length(); i += 2) {
5 i2 V: q1 Q# m           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;
: m: c$ q7 Q- Y  b# x6 q      }
- |5 {$ f! o, k: C( v0 A" Z       int result = 0;+ z0 b2 h5 r" O' i
       for (int i = 0; i < 10; i++) {
9 g" N8 F7 X! X; t           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {
9 v  I$ U# Z1 L5 o               result++;
6 D+ f9 j7 C5 Q) d% B) }0 A' C0 m1 c          }) T4 d% C/ w  y$ K) R( C& g
      }: l* R9 z- o3 \: n
       return result;4 Z; y, a! y. c5 t+ T
  }. d: j7 G5 g* j  h" }
}
2 C5 G) [2 f% E+ i0 K7 t- [, Q
' S/ ^/ `+ @/ k, H' s8 A  R' T【 NO.2 子数组范围和】
% L: ]! _0 b9 i9 @( T* }8 X0 `) _+ \
解题思路4 u8 o( R1 \% C% T
枚举所有子数组即可。5 U8 O. c: v# P; {  T: O  x

/ \$ R/ q2 p1 j代码展示: ~3 R2 h, \2 o( a! h
1 P3 \7 w2 ?/ ~0 W5 S
class Solution {
3 _0 o% ^3 R% B2 g  Y9 W! F1 ?. j   public long subArrayRanges(int[] nums) {
1 c* o9 s! ^  N' m1 j" p       long result = 0;
( x; K5 [. H% ~/ ^+ M( x       for (int i = 0; i < nums.length; i++) {& @. E2 B* j9 T3 G* q! q
           int min = nums[i];
& |" @6 `: d5 [" T           int max = nums[i];  n& P6 E; L' d, j
           for (int j = i + 1; j < nums.length; j++) {4 K4 L9 P: D8 s5 R" C
               min = Math.min(min, nums[j]);
9 X' W0 e! t/ s! O5 ^" `               max = Math.max(max, nums[j]);7 t9 s3 {/ r/ W0 J
               result += max - min;
2 i7 L2 X/ B: }4 S  O          }/ c, l) R6 k' A5 q& t! w) S
      }
, Q2 I- ^# G4 a1 r" M( F       return result;4 ~( Z) u) R3 W4 ?3 ~2 a( p& ~5 j
  }; r9 D7 T3 Z+ j  k4 A3 O8 ?5 Z
}- s% h% d6 A7 ?# {
  j( ~% @  N4 t1 n8 M7 p
0 q1 N6 |+ ^* n8 L; v$ x
【 NO.3 给植物浇水 II】# o) A7 @5 \6 `9 w3 C

# e. J" Z9 M* F% j" g' ^/ \' e解题思路
; u3 G9 a$ {" a" K8 e, k模拟即可。
2 p1 z. {6 f; [
8 w  l# a9 Z) W9 `% ]5 b# E代码展示
5 b4 G5 I" G6 J# g( ]' s: h* G2 o( S- M
class Solution {
) J3 o) Q4 i5 E, F' a# @" j   public int minimumRefill(int[] plants, int capacityA, int capacityB) {) q: u  [  k+ U) y
       int result = 0;0 ^" `* J+ f& @6 }6 h; c
       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {0 P! W- m4 [. n6 q6 }( @
           if (i == j) {7 Y" @2 H0 c$ s
               int c = Math.max(a, b);* O4 f( D% m, g
               if (c < plants[i]) {
' k% t$ W; p1 F. a( H6 u& p/ B                   result++;
5 b& P# a, b- X9 J. g, C$ H              }
# `0 t2 ~6 I) {- i% q6 |7 @               break;
3 ?, ~/ }* ]9 n: @6 ?! |4 p( D4 H          }
: x2 _  ]* k% \8 d. ~, N           if (a < plants[i]) {
/ Q  L) o8 H% {1 s               a = capacityA;
0 S  L2 w% V( F0 {, f( Z               result++;$ w  @; ^2 ~' r; f' @  ^9 u
          }
, ?( F9 m' V1 g7 W, H           a -= plants[i];
+ S$ A* D' ^( c8 V6 a8 H           if (b < plants[j]) {
5 {: ], L# E* `. p. f6 N               b = capacityB;
. B2 E) e) _$ q; \1 s; O7 w  N8 G               result++;
: ~4 k7 d% _- y) R          }
" P' M' `- _; P! a# i8 d' _5 Z           b -= plants[j];
( Y( \7 y) A9 g  S      }! v) S6 U( Q& M& X, @
       return result;
" p: Q. q, i/ |9 t+ h* ^  }
( G1 g) D# ^' T1 u1 i; }}& {7 L$ {8 Q4 Q
7 q2 u  x; L  g

$ B4 W; E; V. {【 NO.4 摘水果】
+ c5 N1 f' _9 \* h7 S
* v: f0 ]2 S$ a解题思路, w$ Z5 }' j7 l. N2 ~1 z% x
我们不可能来回反复走,只会有以下四种策略:5 X- Q2 ?( p" A
3 o: p$ E/ V; {! }9 P4 K
从 startPos 一直往左走 k 步5 A# I% Y7 l) k
, V* p; X( U6 o$ S! D
从 startPos 一直往右走 k 步" Q, ]% o  z( i! N, }

6 u4 E& i/ o" e2 X: w" q8 R从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步7 K; e9 }$ }1 r
( h* q  i2 M/ }8 g' c
从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步
% g( a1 y9 D* u. I# J9 A2 g5 ]! V0 g0 s& I; K6 {! T
1、2 均可一次性求出来,3、4 需要枚举折返点。
  f' y& R9 b. b& c& V+ s) v! J$ Q6 a6 E. d3 Z, B$ r7 a
整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。) c3 `; w" C* l
! N+ h* k* z4 o
代码展示! J) d; Z4 F) Q% |1 T" C2 A
* f, P0 I$ e& o/ a7 H
class Solution {3 }3 ?+ i( A9 \7 f" L
   public int maxTotalFruits(int[][] fruits, int startPos, int k) {
* ~. ^  Y6 b' V/ d4 V       int[] preSum = new int[fruits.length];/ ~- k0 N. T* i. L
       preSum[0] = fruits[0][1];
) |& _/ w# T  q+ a  s7 b       for (int i = 1; i < preSum.length; i++) {
* l: ^  r# c# H           preSum[i] = preSum[i - 1] + fruits[i][1];
8 @/ G! {4 G! C" S* K2 i      }. p' q. Y- \* W$ q2 g

- N/ n  P+ J$ V8 U8 \% F- H# x. z' R       // 1. 一直往左走2 u3 V% W1 a7 a) \* i& n
       // 2. 一直往右走
; b0 e  J, u5 r8 B2 _- H       // 3. 往左走到某个点折返,然后一直往右走
/ p3 @" d. U1 G8 @6 j       // 4. 往右走到某个点折返,然后一直往左走1 i( i6 {4 K3 d  I$ @
       int result = 0;
4 E+ V0 S3 ^' {3 r7 U+ a" t. B6 Y$ |# a       for (int i = 0; i < fruits.length; i++) {9 [2 C  x4 _; \( M, I+ N$ _
           if (k < Math.abs(startPos - fruits[i][0])) {7 |1 S" [: J! y" M+ V3 l+ q
               continue;
+ t) D9 [4 ?% S  d. V! C          }0 P2 r+ B5 H! ]4 K, x
           // 折返点是 i( ?: W5 b; R' A
           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));) r+ _  S4 F* Y0 s  f& B
      }
8 _& B7 F- {+ ?2 x! d- n       return result;+ F6 q  Y: U+ L5 n& d2 R
  }; _5 T) ]6 A& Z! f% m2 B8 Q) }
% ^# x5 Y+ e+ a- I
   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {
8 K* |8 L; S( T9 @% K       // 1. 一直往左走
$ U. {6 {* g( s8 S       int step = 1, idx = startIdx;; t  E* \2 O% b' X$ @& e
       while (step > 0) {# v! d+ `1 ~6 S3 ~* s9 ~; D
           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {
: T7 N0 c7 W) j4 \' {               step /= 2;
; @7 S& _& N  W5 W& K               continue;
; r) Q' L# ~# Z& u          }
; f8 Y4 x" W1 i, h+ {. a; G           idx -= step;
5 c* H' A7 L  r           step *= 2;
" k9 y9 g! s/ x$ ?( m* h      }# {5 I* x5 t( o5 k3 t/ \
       int allLeft = preSum[startIdx];
# I  |% q; C8 T& C: K8 ^       if (idx > 0) {
0 z6 M: `2 {$ v2 j9 {           allLeft -= preSum[idx - 1];
( G; q' I4 j0 k5 u      }6 [" |  N3 E* D& a: z' |
       // 2. 一直往右走
5 U6 d, j( j: o9 A( @( _# B1 o: t       step = 1;
1 {0 i, m7 p' [  N. c, U, c  S       idx = startIdx;
5 _5 p% G% F. U) g/ f% o       while (step > 0) {
' i+ }7 K! [& F5 l/ t           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {9 Y* j& U% v2 m
               step /= 2;
' k9 E  D/ }( O2 {/ J               continue;
% J+ X1 a$ E9 ~% K4 o          }
% @" q5 Z6 U: ]' z           idx += step;
3 B9 q' |6 B" n6 v- i" }2 r4 j' X           step *= 2;9 P, \% I# a( _( I" L
      }
; ^- S* m" r( q( f; i       int allRight = preSum[idx];
. A! k! V$ ]5 q* n1 Z1 ]       if (startIdx > 0) {
6 o/ \4 ~, ?. l& y           allRight -= preSum[startIdx - 1];
: w, J* e' X1 f- T* P      }% F2 |1 E; ?$ t* k
       return Math.max(allLeft, allRight);% j% p1 o- d: V2 \5 X
  }) H% ~- E# f- c
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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