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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】4 {  d' ?" k3 N; ?

) R$ r" f- G- h5 M( n解题思路3 m" e9 r# r- N' G$ P. ~
签到题,遍历一次即可。
1 a+ j8 _5 C5 e1 Q/ Y2 a8 V: J7 V9 d1 @: L6 D
代码展示" \5 F% y( z/ O& i8 \

% G/ A8 q) o8 p* \  w5 R/ K3 Y% \6 jclass Solution {2 Q5 n5 Y4 m  l8 x3 u" s' O
   public int countPoints(String rings) {7 ~" P5 ~* `0 y) M, v  F
       boolean[][] color = new boolean[10][26];
4 x/ G; A8 K4 r8 s       for (int i = 0; i < rings.length(); i += 2) {
, w+ W4 A0 H5 H/ r+ j           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;
, G) U9 F3 L  z3 k6 ]7 w7 O; K      }2 |/ L% t# z1 Q* ~: h
       int result = 0;
2 |' S4 r+ M, B       for (int i = 0; i < 10; i++) {
) Q* C: V- A, E           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {
, I! C4 L5 T7 ~0 K) |/ m               result++;2 n7 r6 T( Z! O/ F! _
          }
5 m3 O* B2 R5 Y      }! \. F2 R9 W; }2 ?0 p% Z
       return result;
$ H+ }2 @( V5 S+ Y  }
: ^, _3 V6 u  L  C6 t% {8 I; `}
% z- _, }# [) N3 j3 @2 L
) p6 m( L- w2 g4 w【 NO.2 子数组范围和】
7 e/ N. b: X: V. R9 f6 T
, Z3 v; T  }1 j& y解题思路& [9 _! |* n( U# b4 t
枚举所有子数组即可。  U4 g6 n& L/ R0 o3 a0 D7 _& n
8 ~8 E( D" k% o
代码展示
+ S0 n" L+ P" g0 C$ R* N% W$ H/ G/ [- j7 ]; e( x# a: f9 Z: K
class Solution {
& E6 n* Q( d! s: X3 C7 ^   public long subArrayRanges(int[] nums) {
% W9 _- `& K; w* k; B       long result = 0;
/ F% q3 v: ]" c, e. ~8 @# t       for (int i = 0; i < nums.length; i++) {
# w2 M5 O2 N" X0 A0 j           int min = nums[i];
5 |$ L/ x" Q/ d7 @/ P& u           int max = nums[i];
7 W+ d# F7 W# X0 T. }1 O8 Y4 D           for (int j = i + 1; j < nums.length; j++) {; Y! o$ V* z4 ~' T$ n$ w+ ~
               min = Math.min(min, nums[j]);* S5 W" _+ F& a0 ^2 a  p; x
               max = Math.max(max, nums[j]);% R+ e5 w( [& C: x1 h3 N4 ?
               result += max - min;
+ Z1 p0 [- `' l          }
9 l8 ~/ _# {. x# m6 M      }
8 ]5 P: Z4 t8 O/ y       return result;8 `+ V8 J$ Y! ?4 B
  }
5 [! V' c) U5 Y; W, T6 s}
% L! e. s2 E* e; M8 j4 H" E, P- J& C7 O- v+ J1 ]* q5 T' `
; C) e. \' E& W7 J
【 NO.3 给植物浇水 II】
+ D3 p1 e% j" _) S! s  g$ J, p( G0 g
解题思路% \7 W9 [; c7 Z) o. ~8 P
模拟即可。+ P! M- k& M; @( L

1 y. ]$ n( }1 A% G代码展示( A7 ?6 D: x# N2 J

1 ~( L4 G7 k) V( Bclass Solution {
- Q. F: Q; B1 {; Q2 x& o$ _2 d   public int minimumRefill(int[] plants, int capacityA, int capacityB) {
6 g  l: G' i5 {& k: _8 _" S       int result = 0;
/ W& [- b% t6 S" x8 r8 X       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {$ A$ |8 s3 s% @! C
           if (i == j) {" \: Z! h; V! l2 p8 e. n
               int c = Math.max(a, b);
" E3 O: i) a- |# K; S" H! u2 @; Z  m               if (c < plants[i]) {
3 h2 O5 i% _, y" z; g5 p( ?8 s9 ^: a                   result++;
8 J8 o5 p! |9 E+ I+ n% _3 ?( y              }% r7 M4 k! \$ q3 L, E
               break;
1 n: ~: l6 o2 {# o9 C3 o) n4 O          }
* p8 c1 J* D- o6 j; s* I           if (a < plants[i]) {
2 v, s2 x% x2 W' s- x5 H8 a& M* W               a = capacityA;$ n2 k9 O. o& T9 R8 X% L8 `( t
               result++;+ r  W0 h9 G7 @- \8 o: X+ V4 E
          }
" R; V; w& v1 S  g' v7 q           a -= plants[i];" }! Z7 q( b5 o* H# |
           if (b < plants[j]) {' s" T- ^& }9 U. r9 B) I
               b = capacityB;
. Q1 {2 u% k) ^4 g               result++;, l  D% R0 }0 L! W
          }
& ?, G/ P8 w& ~4 K           b -= plants[j];* @0 w; e' P# e+ b
      }! m6 Q/ [+ ^1 H: c
       return result;
( i7 a1 n# Q0 e9 j' g+ U0 \; O  }
# N3 o6 ~& N. L7 Y7 Y' {6 U0 }% v- O}$ S! T* `6 s- k8 L2 O

! W1 {$ m1 i# [% u& E. e
. m$ @5 y8 ~: _; v- k; J【 NO.4 摘水果】' B1 g8 d% e* n1 F8 i: j8 ?8 \3 j; A
  G3 u2 b+ C. l4 k+ B) S" l' \2 n
解题思路, E! p# A8 W  x) b! F
我们不可能来回反复走,只会有以下四种策略:
! z! s" d* |' H% H) k  u2 A7 k2 h% f2 o6 e
从 startPos 一直往左走 k 步4 T: R* o8 K+ J# o5 q- i6 U

; v; X+ q) n% e7 g( {1 h从 startPos 一直往右走 k 步
+ m; w+ }6 n& V8 f# _1 A
  j$ k; \/ o& W% f. y$ T) M从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步$ f% c1 h3 N( S+ S7 ]

. E$ v4 N- G! u/ h1 o, W从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步
/ l% @0 Z' {5 d3 r4 c5 [. c, H. o+ a: I  Q$ E, c9 W0 }. F
1、2 均可一次性求出来,3、4 需要枚举折返点。
" t( E4 i0 x: o8 X: R/ w. [) V0 p
* Z0 K5 {: \, o6 o: P整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。1 G, D& T$ d0 \- y' ]" Z( h

' P8 \( u" k. o8 ^( W2 K. v代码展示
6 [# G7 L) z5 M7 C, g! O
$ E& X8 D3 p* U( {0 Aclass Solution {, [% `4 Z4 R6 J5 f
   public int maxTotalFruits(int[][] fruits, int startPos, int k) {
/ I7 @& k( J: X  U; J9 E. v# Y       int[] preSum = new int[fruits.length];
( c) |- g/ Q0 f, V. X       preSum[0] = fruits[0][1];
+ S$ r/ @  k8 U! V# j  ~       for (int i = 1; i < preSum.length; i++) {, j. e% `$ v8 t" X* }; M
           preSum[i] = preSum[i - 1] + fruits[i][1];: u" D, [7 n& {  ~
      }7 R/ \+ V/ B7 `7 g3 g5 p
4 {8 x4 [# M7 t9 O5 ^' p
       // 1. 一直往左走2 c( e8 J/ ], T1 ~* ^# J. s+ Y4 E
       // 2. 一直往右走
3 s& y5 r$ W# `+ A& S  m# \       // 3. 往左走到某个点折返,然后一直往右走
7 v& r' ]& Z/ L; h       // 4. 往右走到某个点折返,然后一直往左走8 J  t- `1 t3 s/ K+ P1 O* {
       int result = 0;4 S5 F5 s' e, `8 O, |. k- A
       for (int i = 0; i < fruits.length; i++) {6 y( a9 w$ w" ]" |, y; ?0 o* g
           if (k < Math.abs(startPos - fruits[i][0])) {
) X2 h# L% k( K" F6 B1 o% g) u               continue;
& U6 @" h) y# G9 A2 `$ ~) O          }
8 o- H4 z  i3 [. C- z7 F           // 折返点是 i2 X" J& q: h5 ~( F2 E; r& }
           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));
7 j- O+ e, b& y+ ?* }) }; v      }: h1 Y, s5 N- A& K" [4 r
       return result;
' ^( T3 q0 s; h) y, s  }
4 k" `  M! Y) L5 b% ^. a7 h' u$ q1 X
   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {
- `# @, b' P$ b       // 1. 一直往左走( c, L; R& }$ ^' x- v6 D0 X
       int step = 1, idx = startIdx;1 |3 y. f3 v2 l* Y$ K
       while (step > 0) {: h; \7 s) h' f: }$ |! c2 d5 [
           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {
; v3 _3 j- J) `               step /= 2;1 c5 d/ Y: G9 i" Q
               continue;
% J; L5 v# S7 }          }
, B0 [' j' c0 N! m8 E" o. S           idx -= step;
" @! C' }2 t2 M# `; }4 b           step *= 2;
+ J8 ]& g2 [! V  Y# u4 p2 K; k      }/ O  k# |2 r, @& D/ o
       int allLeft = preSum[startIdx];
% H6 i& o; d2 y) x- q       if (idx > 0) {
5 z/ Z3 k2 i* }3 `$ V& }4 @           allLeft -= preSum[idx - 1];' z  {  u) H% a: z& k
      }
# [/ {3 f) w' z4 c7 i' `       // 2. 一直往右走
: k4 W* A% v) P* N, B, |4 x3 N       step = 1;
: U& Q, \# v0 C2 b5 G       idx = startIdx;
8 M7 b% M. v8 W: A8 W! }( K       while (step > 0) {
) f9 ~0 o( O6 x) o           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
" K. i. ?  u1 F! r& ^$ I, C9 {7 h, {  o6 S               step /= 2;
/ E5 Z7 S# z" b. G) U8 B               continue;" |/ o( u- A5 l3 U* ]
          }, ~8 T# X5 o! M
           idx += step;
6 u, a, L+ {, `9 X' l+ v/ O- Y           step *= 2;
. ~/ L3 F+ u& c" w1 X6 ?      }
" M" g) f- x4 f; V: H       int allRight = preSum[idx];
8 ?# }; D# f. I# o! i. R       if (startIdx > 0) {  r; T5 J  ]0 }
           allRight -= preSum[startIdx - 1];7 i( O+ B- }; l+ v3 ]
      }
0 M# X  U! a) e8 w: N% F' K       return Math.max(allLeft, allRight);9 f* W& v2 V1 c
  }
+ A7 s9 ]8 w# n& h1 Q}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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