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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】
! {. u# u+ I1 [. p! b$ v% A, V0 ~- h8 c
解题思路# y$ C7 k' ?$ ]/ t
签到题,遍历一次即可。
) G' \; w- ?' {1 a4 l
" x4 `+ J1 X' ^" ~/ N8 R/ _代码展示
5 D1 S8 R' [# K. S% e( B) |3 k( q2 ?% [! b* O; g
class Solution {
8 ~9 Y: M0 G! m) N% S/ N7 V   public int countPoints(String rings) {
% V; ?# m. p; w+ A       boolean[][] color = new boolean[10][26];
& W6 l& M) n2 ?/ |; A% _' {' a6 a       for (int i = 0; i < rings.length(); i += 2) {
/ o- o! z+ i) M7 E           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;$ u+ C3 {& K! M7 s
      }  T: l0 e$ g1 }+ J
       int result = 0;3 p% r& a6 u$ [% ?7 z. o
       for (int i = 0; i < 10; i++) {
1 Z$ f; \* x+ ]6 K1 A           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {8 f. r- V6 Q. ^, {2 c
               result++;
- u" q* m& N7 q1 t          }
. o; g7 S8 C' i6 O      }
4 X: v0 C% c( ^       return result;
! x7 U' W2 Z7 y  }0 D/ y) g5 t& ^! ]
}
& n# D$ g9 @- q! m3 O( Q+ R, ]  w( O' x9 }) O# C$ I4 S$ }& Q
【 NO.2 子数组范围和】
% _8 n/ S; l6 I& G7 G, g
% K- n; v( L# _- m解题思路
; ^8 V. E9 |/ y8 C! e& J枚举所有子数组即可。
# j- t2 B7 g% @8 @4 l1 H6 s3 W% ^8 i3 T/ T0 L8 S0 ?: Y0 r8 E- @+ \
代码展示
1 u2 p: n0 z$ y  Z5 }
% j8 `. _3 }8 T* @class Solution {
+ g1 i. o( X# p$ w5 A   public long subArrayRanges(int[] nums) {
/ b: y7 m$ C- F1 F% Q       long result = 0;1 D8 y9 a3 i; Y/ S
       for (int i = 0; i < nums.length; i++) {0 N, c( D* v- ~6 x
           int min = nums[i];1 p3 M7 u+ L8 l: X2 }
           int max = nums[i];
( v2 U& B  f! I) }* _( l2 d5 d0 K           for (int j = i + 1; j < nums.length; j++) {
" O! _% N( q4 i1 D8 H. D9 P               min = Math.min(min, nums[j]);0 A  R# W: \( d  o
               max = Math.max(max, nums[j]);
' ]5 i  F2 h: K, u4 k/ M2 E               result += max - min;# w0 F- @) }* u; {
          }
. C+ i/ E9 k2 R2 t; o      }; m0 k) N7 j# }4 M& \0 Z2 V1 K. v& y
       return result;
; h* K* G; }9 z/ ~0 c  }: \% q# k' Z" Q) e2 g) R( t
}( b+ ?0 w. U2 K' n9 G* V2 s
: C; L" |+ ~$ W, a
+ z# Y4 V$ _# p  a2 R- d
【 NO.3 给植物浇水 II】! m) s  I( P: o
' ]2 Q' L; Y/ }' h, S/ V; r
解题思路/ I# }- T: F$ n
模拟即可。' ^& V2 j- W. p% _
1 _" E& m* n- `
代码展示
4 M; r( \8 P: t& A" k' s7 n
; @7 L' x# ~) B) x8 k- t( Wclass Solution {# A2 @! _+ d3 w4 U2 a" F3 ]1 e# n) W
   public int minimumRefill(int[] plants, int capacityA, int capacityB) {! d8 f# D1 U6 I; m6 j* g
       int result = 0;- [' X1 ~8 {  l$ L% r2 e- R! K
       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {3 E7 t) p& v6 |# A0 b
           if (i == j) {! r8 t9 K, k2 U' u
               int c = Math.max(a, b);
6 u2 r! q- z2 [& H8 |0 x               if (c < plants[i]) {
1 w  t" j0 T% V) ]6 O                   result++;- o, C5 ?9 q, Z3 [- r
              }
  z& s# }7 x1 L: b  Q; W: d& f4 ]               break;
) @& H" Y$ T$ X$ G* c- l% I3 W          }
' |9 R6 w7 w& K4 B) R1 _" N+ ~% O; d           if (a < plants[i]) {
. B& x5 T6 Y: Y- g5 L' d               a = capacityA;) P, M/ n2 B$ E$ r- m/ t) ?
               result++;
1 [1 R6 T5 M4 `9 v, d$ d& p7 e* U5 c          }
( ^& O7 g) {2 t, t/ C1 u           a -= plants[i];
/ Y; r2 Z2 F0 k7 J0 t' y; I           if (b < plants[j]) {
/ U5 B4 B: @9 q9 o4 N7 o1 x% ^+ f               b = capacityB;+ l) K( x$ W" S7 }- h9 g- E
               result++;5 S# X4 }6 x5 n, B
          }
7 o2 E5 f# k1 X* O4 y' R           b -= plants[j];
' d$ [1 l0 Y. E5 T* \0 a0 ~      }
+ u4 s+ X' o* Q0 V5 M3 n, D, D9 N7 y       return result;  @" R+ }, v* I+ q/ x, o5 q
  }+ A  }9 l: `' E* A
}
" x+ p9 R; R4 |3 d% U) w: q
; W4 H5 Q, F! f( Z7 ]- ~4 s, s& F
【 NO.4 摘水果】# S$ X& Y' B1 A5 j: _, i* \* ]! O

( |# S1 q7 ?! r: ]解题思路# X2 ]/ Z& B6 c- `, G4 m
我们不可能来回反复走,只会有以下四种策略:- t4 W6 {/ o( e

/ H, e" I+ |% N2 B4 p  k" m7 P从 startPos 一直往左走 k 步! h' c7 w$ v+ u
* P! v* X4 B9 n0 J5 ~! p# J& ^9 W
从 startPos 一直往右走 k 步
0 v0 I! C: W9 ^3 v* h6 d( W& W
! ~& I, F  F( ]- r8 w5 X8 ^从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步) F# c) g. H- J% K
. \1 F, h. G- _. a" w0 b5 u
从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步( y1 y3 d5 N; V; P* u* T  L5 c

% [( k% d; ]' U# Q3 g/ p* I1、2 均可一次性求出来,3、4 需要枚举折返点。7 |& f6 s1 j+ x# r+ L3 U( X! [1 d
* f: y+ f$ ~, Q" F7 }! L' q
整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。% D& D8 ?# W* T. [) H9 l8 X; m

& B$ U; H3 s" U代码展示
2 v- b9 _2 ^$ c
) y9 @8 `6 Z& dclass Solution {" A4 v5 W0 ]3 y3 M1 J
   public int maxTotalFruits(int[][] fruits, int startPos, int k) {: I% D9 C2 i9 N. A
       int[] preSum = new int[fruits.length];( `/ H2 b! k% E; A: M$ A
       preSum[0] = fruits[0][1];0 j. }* g' Z( ?  M: v. A
       for (int i = 1; i < preSum.length; i++) {, J+ c; [! o3 ?! r' z8 q
           preSum[i] = preSum[i - 1] + fruits[i][1];
2 e" X/ q: \! s/ q( X      }
/ t7 B' {$ K2 U5 A
4 B, t& L/ F( O9 A3 U( G3 `9 r+ @5 x9 S       // 1. 一直往左走6 D, l0 F- b0 t! m
       // 2. 一直往右走
  u8 {( i3 r: Z4 G       // 3. 往左走到某个点折返,然后一直往右走! s& F+ X4 ?5 y- S& J' _( g( j! x5 l
       // 4. 往右走到某个点折返,然后一直往左走" x! f- n  c2 h
       int result = 0;
' T# k  c# f* g1 {       for (int i = 0; i < fruits.length; i++) {
- Y- @3 j" u7 k8 K5 n$ O! |           if (k < Math.abs(startPos - fruits[i][0])) {7 B" u, k/ w- I
               continue;
  }6 j4 R5 S: z" ~) s          }* i2 B( I2 Z9 k. X1 r9 o
           // 折返点是 i  ^( l0 s3 }8 B( X; Y1 p. Q
           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));
2 W& g  F8 o4 r      }7 ?8 ^/ x$ p% s$ p7 I9 }6 P
       return result;
0 z9 A+ @4 F% ^$ A  }
7 b. I. a3 n& U
$ d5 T/ c6 m, H2 h# N0 t   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {7 J& D$ |, A' r
       // 1. 一直往左走
1 _. b: a" V, ~6 A       int step = 1, idx = startIdx;
0 M  t# H0 ]3 I- Y8 N* z, A7 d- ^       while (step > 0) {  C7 ~8 h3 ^- z8 e: S( o
           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {
2 e( q# F- Y( V: i1 ]               step /= 2;. G* N+ W2 C, y$ a
               continue;8 O( Q# a+ f& E2 T0 H8 B  ^
          }( O5 s4 C1 D  M: p7 e8 U
           idx -= step;
3 X1 V) k, V9 x' e           step *= 2;
0 e9 X0 ^3 s$ b, g. R      }. @: T" @9 m! i! I3 S$ G
       int allLeft = preSum[startIdx];
3 a9 z7 j1 I1 m5 U( H# V       if (idx > 0) {; |  j" }! {3 W' n& B  E& y9 ?
           allLeft -= preSum[idx - 1];
8 r+ B" E! B: |+ r# z      }
6 }2 Z# e' j  m4 k7 H8 @       // 2. 一直往右走5 e# r, C9 \$ B. i
       step = 1;
3 B% m* P; P+ ]; V0 F" ^7 ]       idx = startIdx;% Q6 U0 _& K# m6 a3 Y- x
       while (step > 0) {
1 @7 Y5 x* b( g9 D           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
1 B" {2 [3 c  \' F6 J6 q9 O               step /= 2;1 U4 w: S0 [6 n8 w3 _, }
               continue;
& M( ~4 ^5 M2 y/ ?/ Z; @          }5 o6 q: \7 X+ O( o( \: y
           idx += step;0 i: S' c* `% f6 i9 d7 G
           step *= 2;
+ s7 y$ z" ^; J: X% T      }
1 |$ L4 I: A" b  I4 M       int allRight = preSum[idx];
7 n6 a1 d; Y7 _5 ]8 R0 ?       if (startIdx > 0) {
' B2 a/ j9 s5 T) s           allRight -= preSum[startIdx - 1];
& `3 G5 ]+ I1 u! }      }
7 G) D3 ?" X1 e/ ~+ [- c! j, k* N       return Math.max(allLeft, allRight);
! ?/ ]3 l( U. K& q  }2 R1 F& y2 C, k  j
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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