找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 环和杆】, ^8 ?# D) S! c6 b
3 J3 x+ H! h, s3 v* {. v
解题思路
" ?- a; g2 w! l, D4 _0 r签到题,遍历一次即可。% l1 v5 Y8 k  L1 `) @" ~  M3 V

0 v9 L5 c2 l+ P" {" @$ d+ j代码展示0 I7 M0 P, }+ B
  J5 A* q  n! L" N, @) u1 y5 ^" N
class Solution {
% i: x( Y  C  V/ `1 C   public int countPoints(String rings) {) b6 D0 J2 w6 L: L' E# I+ U
       boolean[][] color = new boolean[10][26];  @4 n8 G! D, d1 f
       for (int i = 0; i < rings.length(); i += 2) {
; B" v9 M" `9 ]: o! s- v           color[rings.charAt(i + 1) - '0'][rings.charAt(i) - 'A'] = true;2 h3 }0 R* n& e' n, k+ u
      }/ D5 c) @9 }+ T6 P
       int result = 0;
" Z2 ?3 o( e+ }/ ^$ p- E       for (int i = 0; i < 10; i++) {
. S/ h* V1 t5 S3 S6 k( a5 e4 S           if (color[i]['R' - 'A'] && color[i]['G' - 'A'] && color[i]['B' - 'A']) {
% y4 B/ `8 p- P- K! v; j               result++;7 Q! ]' \, a4 [1 _* x8 ?! l
          }0 t3 c! h& D: c
      }  p* a3 E) k; E& Y
       return result;
$ y) ~% y8 }+ {5 d" n: H$ \  }
' ?. r2 d* O! `, r}3 u- U4 a7 j7 ]) F! Z' X" S/ u* g
2 B1 ]9 H/ G* p. `
【 NO.2 子数组范围和】5 d; \6 B7 V9 e6 s' f

9 C. ^6 W5 p. K2 m5 j6 f解题思路4 a7 Y' n/ W6 x$ `" e
枚举所有子数组即可。7 Q+ g. r. W+ C8 ~; e2 a
# ]2 S4 K& P) E3 }6 g1 Q; x
代码展示
% u& L9 z; R$ w$ P% f: V& y9 s) C. B" H7 Z9 t5 S' A
class Solution {
" n; ?! y' p' r   public long subArrayRanges(int[] nums) {
3 u$ c& u: ^# |* Z       long result = 0;
3 e# O) B( s- A: ^' e0 W# ?; q. e       for (int i = 0; i < nums.length; i++) {
( I& W* Z9 B' Z. @           int min = nums[i];
9 E$ x1 R; k" I- O4 T8 C4 b           int max = nums[i];
- `3 v+ c' E8 A# @# U  Q           for (int j = i + 1; j < nums.length; j++) {
3 \/ H4 J1 i) Y1 ?7 v               min = Math.min(min, nums[j]);
' {. d2 {7 o( z% s               max = Math.max(max, nums[j]);
. l6 e' u; m( U+ x1 G* S               result += max - min;8 x  f' T8 \' z' h
          }
1 u. }) r0 @& }: N0 Q& j# ]      }% ~3 e. H7 h# k# v) G/ F8 i% N
       return result;6 [- O4 e5 d  C/ k! k
  }6 a5 L' b# ~* a5 j
}1 W; i; |# T* }
: ?7 ~8 l$ d/ h" X  g5 s1 v* ^
+ _7 Y$ v2 }5 ~* T9 Y! @: ]5 `
【 NO.3 给植物浇水 II】
3 _) ^3 b  q" \" m* M, p. w8 w& m! i8 T
解题思路& |. I+ N1 a/ x; ?; w3 C
模拟即可。
2 M; O  U, b5 V* F3 H& b+ J! w+ I3 E, O. ^  B8 ]8 o2 H3 E
代码展示
4 U% P- d* p  p* Y
+ [4 D4 t2 |$ U7 Sclass Solution {* W8 s+ K8 c) q
   public int minimumRefill(int[] plants, int capacityA, int capacityB) {) A% }6 Y5 H+ }2 b" b
       int result = 0;
8 U  o( B9 e. a6 ?       for (int i = 0, j = plants.length - 1, a = capacityA, b = capacityB; i <= j; i++, j--) {5 }- x* @$ u, f- `8 [; L" h9 Z8 A
           if (i == j) {$ [, m/ x) P' k; s
               int c = Math.max(a, b);2 N9 g: m, w# z) v! Q! Z
               if (c < plants[i]) {. p: C$ f$ ]9 s# n! A& Q+ b7 D
                   result++;
! @, `9 y7 R% \5 E              }0 m- i$ a+ o" b! Y& a7 c% m
               break;" C/ b# b5 s+ d# Y/ S( |: e
          }
' t) u( a3 f+ r$ g( N" i           if (a < plants[i]) {
# C& g! T. z4 n9 a! P$ E; i% S               a = capacityA;
' n. a2 \) C& @( ~: `               result++;
" c8 x" r- l7 m% b7 P          }. Y" T) w. ?5 `
           a -= plants[i];; Y% G- J& b& u: l
           if (b < plants[j]) {
6 H( ~$ {5 ?7 V- Q- p7 E               b = capacityB;$ q; i8 x# |  V6 h: c, u% c
               result++;% e) @# j& M8 q  l: A" L# ]4 _
          }
! y0 _2 e! o7 w5 Z: M           b -= plants[j];. Q$ B9 l( r5 q8 j. ]
      }, K% r. u% `7 p+ N) S9 @
       return result;
6 p6 z; f$ Y; a, J( J  }, o5 O- b% w+ K/ I
}
& n, S1 j$ ^( K2 u
% n( J/ N. O8 R, D. ]
7 Q5 c% O0 M- S( ?0 R, W【 NO.4 摘水果】
) W! ~5 c  Y! y; f7 }6 |
/ C8 s1 Q( S  x/ _- q. A解题思路2 J3 E: B2 T& g& i( o; k" ~
我们不可能来回反复走,只会有以下四种策略:
3 g, @9 o% R5 }# j4 Q( k. U* l' J: o
从 startPos 一直往左走 k 步
, g9 p  X. b! l3 z6 L8 k" l2 N9 E' @7 E* p4 F5 `9 ]" ?
从 startPos 一直往右走 k 步; j  j5 j  D" m: v9 w. d  |
) L8 _/ Y6 g, i
从 startPos 往左走到某个水果位置,然后折返一直往右走,直到累计 k 步
1 i% _- _8 u* R$ `  n% }. s  l
4 i) I+ V( G- h! b5 d. m; e从 startPos 往右走到某个水果位置,然后折返一直往左走,直到累计 k 步9 }# j; W1 p' D0 x/ t  W; ]2 p6 h

2 M7 U! O8 J9 \% `: S1、2 均可一次性求出来,3、4 需要枚举折返点。
8 l+ V3 a+ Y7 ?3 }; G/ l1 ]5 G$ ]: O5 ^! g( V- Y+ M
整体上计算前缀和,然后利用二分或倍增加快 3、4 的求值。" Z4 w; \  J2 z. M& r$ L8 Y
% K$ b/ u) h& r9 i' a  ~
代码展示
9 }9 ^# k2 b% T7 m7 J- a0 `" I' `4 U
( @0 y8 ]( P$ ~) u& {class Solution {
8 E' ?/ {5 |1 C& a7 i0 V. U   public int maxTotalFruits(int[][] fruits, int startPos, int k) {& U; D. }+ M5 {5 s% [, U6 C0 W
       int[] preSum = new int[fruits.length];5 `8 r* f, r  y  I( e! z6 }
       preSum[0] = fruits[0][1];
7 Y& w, R) E* w+ v1 Y7 N: F       for (int i = 1; i < preSum.length; i++) {9 u: K; n6 |$ u: N* q/ k
           preSum[i] = preSum[i - 1] + fruits[i][1];
1 B. I# a+ S, n$ n1 D      }
- C, A) b! Q" S. G4 O$ c, J1 p) M  m2 _
       // 1. 一直往左走
% r& B; I2 b0 m: d$ `6 a       // 2. 一直往右走
3 j( V! @( Q" K  d2 E       // 3. 往左走到某个点折返,然后一直往右走: Z5 q& N! I. X: Z7 K1 a3 `6 t
       // 4. 往右走到某个点折返,然后一直往左走
  t! k' [0 {6 q+ m( v       int result = 0;
) \* }$ I7 o, J. \       for (int i = 0; i < fruits.length; i++) {
# a( s6 O, ^9 [. L# M8 R" V           if (k < Math.abs(startPos - fruits[i][0])) {, ~3 J7 K8 a& t6 X  ^
               continue;: m  g: M7 L8 r% {
          }
9 x" R  n9 Y- ~; F) _           // 折返点是 i9 ^! p7 H% v3 k1 Y  Z! S0 Z8 f
           result = Math.max(result, maxTotalFruitsStraight(fruits, preSum, i, k - Math.abs(startPos - fruits[i][0])));+ X/ O7 p$ `% E9 @, q
      }* M5 d9 R5 p5 ]' z
       return result;; V: F( V9 `2 ?1 z0 z0 x& s
  }* _# A" v: {7 \4 S( H
, u4 M! z* {! d
   int maxTotalFruitsStraight(int[][] fruits, int[] preSum, int startIdx, int k) {
. P/ i7 d6 ?6 p' c       // 1. 一直往左走
- K2 s. k9 E! s: _       int step = 1, idx = startIdx;$ v6 X1 ]2 h2 Z3 N. i; G( }
       while (step > 0) {
4 ^: G/ `7 m* L. O- X7 z4 H           if (idx - step < 0 || k < fruits[startIdx][0] - fruits[idx - step][0]) {+ K3 M! d: q3 h! |7 A) j8 u- v  m* D8 ^
               step /= 2;$ \) {: {5 J/ Y* B* [2 ~5 ]1 O
               continue;! P: J% ?1 r: S; Z9 c2 K5 u$ b
          }
: G: Z. k- C) S  D5 A9 }2 m' n0 f           idx -= step;
+ Y4 z  |" E& Y) L" v( m' L           step *= 2;8 S- M/ I1 ^$ p' d8 q4 T! J
      }% P; D' j  l  ]5 o8 ]* K
       int allLeft = preSum[startIdx];% j. O& _. w. h
       if (idx > 0) {
; H  n0 o1 b7 [5 s) N& _: M8 I$ e* {4 J           allLeft -= preSum[idx - 1];
- \9 f. O$ P1 F6 I      }
" K7 _4 o! ]' M& N       // 2. 一直往右走* l1 u$ J) f. p; l; |$ }
       step = 1;" a7 f. V; z4 \0 |* l: H, Q
       idx = startIdx;9 k" r) o; e) _# {4 c
       while (step > 0) {
7 m* n2 S  s8 ^/ V           if (idx + step >= fruits.length || k < fruits[idx + step][0] - fruits[startIdx][0]) {
1 M" d' d# p: R               step /= 2;
1 k3 W' m& ^0 K               continue;
9 @1 f3 p. c5 ~' }          }
* g5 U% Q' T; r8 t           idx += step;
7 [; @5 ~* g7 a8 T" K           step *= 2;
9 S. K, W+ L8 y: M$ c$ @+ N) x( R      }2 M0 o; e; S! y+ M3 ~
       int allRight = preSum[idx];
; d5 p$ u4 D$ O9 S6 ]       if (startIdx > 0) {0 V! w! X. j. }5 T9 j* b2 o0 y0 H
           allRight -= preSum[startIdx - 1];2 C6 G' c* j7 Q
      }
: ~! C: \# B4 F( Y; y9 \" z; }       return Math.max(allLeft, allRight);
" \+ K3 y# d% \2 q9 e  }1 p9 l1 k! \5 p$ u' s7 e7 p
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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