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

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

上岸算法 回复:0 | 查看:1450 | 发表于 2022-3-24 05:53:38 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计数组中峰和谷的数量】9 c. J& d( t+ o" Y; w% |
4 M- g# g0 V7 D2 K; y& Y: ~
解题思路
) b) I; [6 J' Z# I- @4 x9 w先去重,再统计。
5 K7 }9 d; o- O- C; w( U
! ^% N1 ^1 X% G/ S  q1 Y; G代码展示8 }' m+ u! N# @6 [$ Z; p6 t

+ p/ u( X& v2 X( d8 ~; ~+ Wclass Solution {* r% a6 Q1 R; p4 v! `/ z
   public int countHillValley(int[] nums) {
2 ]0 V; F" D$ l' ]; Y* k       int len = 1;  @% z. \7 k6 c9 i% @! ]+ p+ r
       for (int i = 1; i < nums.length; i++) {
, T: F. |  R) d3 C8 k# |! j3 \: [! R           if (nums[i] != nums[len - 1]) {
* U+ r6 i* i- _& r' }+ c$ c               nums[len] = nums[i];
- ]7 ~0 W6 Z! c* {  N               len++;/ V, D* ~" p' j. n6 ?, O9 p
          }
+ i9 D2 e7 p* Q  q/ l      }
( R( e% Y- X' g! W& S3 k       int res = 0;
6 f* {! \0 ]8 _# [4 q* {6 F! @4 F0 R       for (int i = 1; i < len - 1; i++) {3 q: v& a, D; `& J' o4 p% z
           if (nums[i - 1] < nums[i] == nums[i + 1] < nums[i]) {7 e$ w# `+ a( I9 e0 S/ n1 [
               res++;$ ^/ _5 @  ]& p
          }
% Z/ v/ I9 q9 Q) I+ b% S) a% j      }) J& r4 ~6 Z# [' w, ?/ Y
       return res;
& Z' i. [' p* w5 H& F4 G* |* ]! L  }
) k  }8 I  @5 }0 d8 L}* C. l! w3 C8 R% C
6 r4 T, ?1 X4 n+ E& ~/ {+ M
( N2 `0 R8 z8 E5 X
【 NO.2 统计道路上的碰撞次数】7 q" d) H- l0 n

/ F( F/ O4 w7 r解题思路
) I2 }* \) Q( X从左到右遍历,维护左侧的车的状态,有两种:
6 {* i% D2 L. P" b" [; O& k& m' w  C# [
$ T# y/ B/ a0 a& h/ r若干个向右行驶的) E+ [. M! R* ^2 B

0 ?9 d; X. D( U; m停止
7 Z! `* o: x  _/ ^3 Y1 x2 |8 N% F: B: C! ?/ P
代码展示
/ W5 G  g% s2 @( n, a: z2 l$ D, E! i+ I) I* m: m$ ?) G! c" h
class Solution {& A( Y& |4 c$ |- i2 y
   public int countCollisions(String directions) {$ Z# _: c* r+ M$ K+ Z5 Q
       int res = 0;0 ^4 i% b- W3 m* n: e/ b
       int S = 0, R = 0;3 S( O+ Q% T( g5 Y
       for (char c : directions.toCharArray()) {2 G% e" d1 l5 M/ W: @2 I$ c
           if (c == 'L') {+ O+ h& z! G/ @6 h6 P; w
               if (S + R == 0) {
, ^. Q- C; }* A. }/ Z; R5 ]                   continue;$ v: p! T1 F+ W6 R8 s% H
              }: {9 ?4 G  o) t7 K% n
               if (R > 0) {  D4 |- I" @0 `1 y
                   res += R + 1;
& _$ W" K4 S4 U" Q              } else {, B8 n' I* {$ h& W/ S. b3 K9 t
                   res += S;4 a! w. k& n: _: L6 T) ~$ D$ }
              }% u2 m4 Z4 \" B' d: q4 q
               S = 1;
4 R$ P: L4 e" J/ z1 a               R = 0;
# a  ?" \( Y; E6 F          }, j. ^% @$ P! u" r* d- H$ D
           if (c == 'R') {9 _* X& ~( D8 A
               S = 0;
7 E% j4 {% s# {6 d3 |" Z) ^               R++;
8 U# e; A+ m; R          }- y2 h1 D7 _4 Y& C
           if (c == 'S') {
3 O/ ~  N7 G( v6 L: C9 y& ?8 r               res += R;
$ k  _9 \) }7 e7 [               S = 1;+ A. m& V. [2 d" l& G
               R = 0;( b  `3 {9 L5 `$ o; R: ~
          }: v6 e+ p2 k8 j! S% z( a8 G% C
      }& X8 c: R& [$ S2 r8 o2 e
       return res;+ v/ C" D7 o1 t8 w: S" @
  }: D& }3 {: U2 r: d# p
}: @5 a' e4 P7 j8 U( P

3 }  z% j( d- \3 a; J. w. R' S& G2 W+ R* r: x2 |* c3 U; N) [( ]" b" w
【 NO.3 射箭比赛中的最大得分】
5 F: {0 v7 |8 S5 ?3 z' a, V
6 P. a$ ~" Q6 X: _解题思路
5 Y7 d6 T; [9 _5 U/ ]! j- _9 H# k9 W枚举所有的情况即可,实际一共有 11 个得分位置,枚举 Bob 要在哪些位置得分。. a0 i# ~7 A- h8 f
2 @  Z' I+ V3 ^8 X9 T1 z
贪心地,当 Bob 要在位置 i 得分时,只需要花费 aliceArrows[i] + 1 支箭。( r* J* E7 L8 W) j$ z

, `0 s* r% H6 Y- t6 o最后多余的箭可以放到位置 0.
9 y& I4 |6 o; s3 S+ [+ L9 p
5 p# g* ?* v! F" K代码展示
3 j" B; Q/ o8 Q8 m# B
" d0 j9 R* C& x) q; {8 hclass Solution {5 Z0 h2 c# I8 v* v7 `* y
   public int[] maximumBobPoints(int numArrows, int[] aliceArrows) {8 s/ ^7 L( O7 y+ C( p4 H
       int max = 0;
( _/ F4 _: s: r$ w6 V       int[] res = new int[12];
. m8 `  u, x- `' c       for (int i = 0; i < (1 << 11); i++) {
( g) g& x* Q# k           int num = 0;
, O3 J, B' z4 W           int score = 0;% s) l4 M; }9 s2 t0 D, ^# n3 Y5 S. o5 r
           for (int j = 0; j < 11; j++) {3 F* t% _- r& ?# M
               if ((i & (1 << j)) > 0) {
; D8 Y$ v$ _# J1 @' x3 Q& J                   num += aliceArrows[j + 1] + 1;
" K0 W  z+ h7 G                   score += j + 1;. c% Y$ v: m2 Y$ J  @6 S
              }
, J# z. `" x$ g7 J+ a0 T1 \          }4 r' a& R- D$ }& H% c: F' k
           if (num > numArrows) {2 Q! r% W/ S2 x# T# I
               continue;
1 n' r) _2 Z) U  d) I+ B          }
0 k2 f3 B5 d& g& F8 F0 G9 T           if (max < score) {
. L8 f, S  n5 |, @               max = score;4 T; J' m- f( J0 @1 h. T
               res[0] = numArrows - num; // 多余的箭
8 ^! j/ l9 d. M9 @               for (int j = 0; j < 11; j++) {
: G8 O) U# f0 M3 |                   if ((i & (1 << j)) > 0) {
5 M# G+ z& f; h7 u' q# @                       res[j + 1] = aliceArrows[j + 1] + 1;
8 x. M, R* W+ p; g                  } else {
/ A1 c2 ]7 Z, e4 @8 k% c& C                       res[j + 1] = 0;
, V# t8 D/ O# \$ J# g7 K                  }
/ b2 n7 r0 U5 b; m1 S/ G: `- C              }
: Q7 o* K: H# v' `8 |' |/ W/ C2 P          }
' V9 J- Q0 x$ M; x" G- b+ ~      }" s. q& t- s& F5 R
       return res;
" r6 z$ P1 g& @) T) A  }5 D; J) y! U  R  }, z- R) K+ t
}  J. J" A1 m+ Z1 W+ F6 w
+ x9 v6 e4 _3 K2 t2 x6 L

3 {* g5 R" f5 M( l! s, L【 NO.4 由单个字符重复的最长子字符串】2 e9 ~# v# p) \. B2 J$ x

& a# c  v1 X4 T' f- ]1 v解题思路1 U- V2 ~. N8 @. x9 T3 Z# f" \
灵活运用 TreeSet 即可,详见注释。
1 F" t4 x- l; O1 i
9 m) P1 Q5 Q: j/ W" p: O代码展示
/ b! w; k% M4 O: ^" @' Z
: p% w$ y: D3 r+ T1 X4 N8 _class Solution {- C. _6 z! i. D+ D2 }* W1 U+ i

, s/ M( n" i8 _4 a& N   // 一个 Interval 表示一段连续的字符
0 _. J1 ^# {: X+ x5 R9 Z   static class Interval implements Comparable<Interval> {
2 s# r0 U8 d/ n& X$ ^' l( _       int start;
8 f. W( A- @; V/ f: Q1 J& _  U2 @       int len;- v8 `! }, n( l7 w
       char c;+ d$ z( I. E8 {7 x0 M
8 r0 |) a& h, y& f+ x
       public Interval(int start, int len, char c) {
$ P! d: U& a9 F8 i           this.start = start;4 d( x5 Y3 p% v
           this.len = len;$ s, |. V5 U; P
           this.c = c;
" k0 L% b  e6 X" X7 W/ G7 i- U5 u      }
% j; `: q6 y, C( n5 [5 H
' q# w- Z* F0 o# s& O- j7 A8 ]       @Override7 l! k7 |% H4 @: k2 R& S/ `' M
       public int compareTo(Interval o) {
- r: a4 T1 r  d* ], G           if (len != o.len) {( M. L* `+ R2 q5 g9 S
               return len - o.len;
0 R1 Z" k3 j0 F* o          }
7 l1 m/ Y0 g; G: G, I           if (start != o.start) {2 j6 U0 o1 o2 R+ _' l3 X* Q
               return start - o.start;+ W, H9 T9 b. n, F5 ?2 x
          }% K& }$ A8 G' J2 S. p2 r( I
           return c - o.c;
6 J2 y8 Z8 H1 E- S      }" d6 Q* U0 d" _- f3 v0 b* S, T0 ^
  }* f  t- y6 S. k

. @* F5 Y  g' c  l3 }$ L   public int[] longestRepeating(String s, String queryCharacters, int[] queryIndices) {
" {& N- s. s  j. Y7 {: B       // 首尾新增两个其他字符,这样相当于 queryIndices 不会修改字符串首尾,便于后续的处理: F4 r/ U( z! a/ k
       s = "_" + s + "_";
, H: R( n9 O" V) b       // allIntervals 按照 len 排序全部的区间
4 o" N' b1 o- o8 X% p: d; c       TreeSet<Interval> allIntervals = new TreeSet<>();
0 e% _* y0 ?/ ~! U8 L6 y3 Z       // intervals 按照字符聚合区间,即 intervals.get('a') 表示字符 a 的全部区间,并且按照起始位置排序
+ C# v: F! _1 m  _" L       Map<Character, TreeSet<Interval>> intervals = new HashMap<>();
, O$ h" G& X! T9 s( `# T  S! Z       for (char c = 'a'; c <= 'z'; c++) {9 k+ p) l  s$ b: }( Y. _
           intervals.put(c, new TreeSet<>(Comparator.comparingInt(o -> o.start)));4 I$ ^2 K( ]6 s1 H- F$ c
      }
) Z5 ^  l; a, A$ H" s* R5 y3 p       intervals.put('_', new TreeSet<>());
& ]4 c+ G. A, F# z
1 V6 Z7 {$ R6 X       // 遍历 s 维护 intervals 和 allIntervals! }$ n6 w6 v4 u7 X: I
       int last = 0;+ e" N: l1 U2 g; F7 I: I
       for (int i = 1; i < s.length(); i++) {
+ ]/ P) y) ?1 Q' T( Q           if (s.charAt(i) == s.charAt(last)) {/ h. u/ A( \; a2 e2 N
               continue;, _+ l2 t' j( r) t1 S% \
          }
/ }& W% Y9 ^& P5 v6 W           Interval interval = new Interval(last, i - last, s.charAt(last));
) K" p8 @# j' H+ f; }2 }# N8 M4 b5 o           allIntervals.add(interval);
3 E4 ~) ?4 U, @% g, Z5 |. u           intervals.get(s.charAt(last)).add(interval);0 k  n6 ?' O% o* i, V- K
           last = i;8 e7 s7 P+ ?4 R# X& {( E% h
      }
- v4 [( `3 A/ H2 f3 _* I4 u/ I       Interval interval = new Interval(last, s.length() - last, s.charAt(last));
; G3 b: P& |. I0 U8 R$ f0 x7 p6 U       allIntervals.add(interval);1 F% Z9 M2 |# U# U. `
       intervals.get(s.charAt(last)).add(interval);
& G" N% Q( e, |% ~1 s7 D7 r
+ A. v5 I& }( v/ L, X9 c2 H. Q       // 每次 query 调用 maintain 维护 intervals 和 allIntervals! c! ?  w! B" I) b8 V/ `& W
       int[] res = new int[queryIndices.length];
% C; t' \5 |, N& |' o! D7 u: V       char[] arr = s.toCharArray();( s. b- ?) W9 w. i
       for (int i = 0; i < queryIndices.length; i++) {
$ Y; E  s% g& M" j+ {- y           res[i] = maintain(arr, allIntervals, intervals, queryIndices[i] + 1, queryCharacters.charAt(i));
, r5 P0 |& C4 c! Q% g& s7 @      }
! c5 g+ v+ T/ T* I: X$ q1 u; J4 R       return res;
: K- s- u! z  E: _" i2 s& e  }
- y- p' c) E4 f8 V* v9 z* h% m5 y- K
   // 将 arr[idx] 替换为 c  E. M4 `& g: A) b& G4 }9 z
   // 维护 allIntervals 和 intervals
3 g; W3 p$ ]+ ~0 \( k2 @3 {   // 返回单个字符的最长的子字符串长度
8 G9 q7 }2 h5 s( r8 Y   private int maintain(char[] arr, TreeSet<Interval> allIntervals, Map<Character, TreeSet<Interval>> intervals, int idx, char c) {9 }! H, Z9 _* J8 l( j
       if (arr[idx] == c) {
9 S5 b; u; N' a8 j           return allIntervals.last().len;3 l+ c+ ^  b7 ?( e
      }: }# H" Q2 H- t4 g. X: Y

) j6 w6 k2 Z& a& ?- h' x- W( E       // 维护原字符 arr[idx] 的 interval/ Q: G. [" C$ I" I1 i7 i. @" p
       var treeSet = intervals.get(arr[idx]);' J) G+ p! ~0 t6 t6 v! p7 s8 ^
       Interval origin = treeSet.floor(new Interval(idx, 0, arr[idx])); // 调用 treeSet.floor/ceiling 时,只需要 start 即可4 y. ^0 v- q* ]5 m6 N, c
       treeSet.remove(origin);
. O. V1 h6 ?% j       allIntervals.remove(origin);8 y3 g( P* C, d2 q  G7 _& j3 R# |4 W9 d" V
       if (origin.start < idx) {. B; D9 F, f' m+ Q( T7 l7 l# t
           Interval interval = new Interval(origin.start, idx - origin.start, arr[idx]);
0 `2 k+ H1 L& D% n, r           treeSet.add(interval);# d, L2 i# Q1 A" Y& |' ^
           allIntervals.add(interval);
& H5 e# E' Q: R6 e1 E      }
) t( e( R. V, s% p       if (idx + 1 < origin.start + origin.len) {
1 f+ n2 l( Q- V! v) H3 e           Interval interval = new Interval(idx + 1, origin.start + origin.len - idx - 1, arr[idx]);& w$ h9 d; d% w
           treeSet.add(interval);
- b1 k1 k3 g& S2 q: D5 M4 a           allIntervals.add(interval);# g( E; j* G% ]+ P& Y, K7 d
      }
4 L) p& U) K3 f" u  U% e% |5 {. O- Y- m8 d  K% N. y# L' K
       // 维护新字符 c 的 interval
& d4 ]! V1 O' j- K8 p       treeSet = intervals.get(c);4 F( K- P0 B, e8 T
       if (arr[idx - 1] == c && arr[idx + 1] == c) { // 左右连接' [$ y& `. X/ D0 N
           Interval left = treeSet.floor(new Interval(idx - 1, 0, c));# J7 C8 u9 E0 g+ u
           Interval right = treeSet.ceiling(new Interval(idx + 1, 0, c));: r9 Z! C  \2 G" H. |
           treeSet.remove(left);
6 E+ P2 |) x1 z" R2 o2 O           treeSet.remove(right);
: g  g6 N. {9 _8 v! Q           allIntervals.remove(left);: z$ N/ g4 z/ U9 z8 x& y
           allIntervals.remove(right);
% x! M( a5 o, u           Interval interval = new Interval(left.start, left.len + right.len + 1, c);7 s/ n: _) h, P6 n
           treeSet.add(interval);2 b( w0 C7 c6 M( |
           allIntervals.add(interval);$ |7 y+ Q7 M( I4 i
      } else if (arr[idx - 1] == c && arr[idx + 1] != c) { // 左连接; t, M% u( c4 @# o
           Interval left = treeSet.floor(new Interval(idx - 1, 0, c));5 `4 j. X! E  j/ \% B/ Z
           treeSet.remove(left);0 {+ S6 M  q$ C; C( W
           allIntervals.remove(left);3 n/ d% H0 F; q+ V
           Interval interval = new Interval(left.start, left.len + 1, c);
3 _2 `7 C8 m) \6 W( l9 V, ^- k           treeSet.add(interval);
# M0 _+ o, M# t           allIntervals.add(interval);  A: d5 Z5 X% J$ A  G* Z( Y! T7 F% D
      } else if (arr[idx - 1] != c && arr[idx + 1] == c) { // 右连接
& _8 t. G5 b- U3 t! {, y           Interval right = treeSet.ceiling(new Interval(idx + 1, 0, c));
- Y7 ^7 F2 C  w4 E           treeSet.remove(right);" c% w/ P- b0 J! T; G; {
           allIntervals.remove(right);
) S0 @# \: ]8 d5 I/ V! F: g9 S, T7 f           Interval interval = new Interval(idx, right.len + 1, c);. }  D* g2 K; q9 ?0 |/ @3 o" n
           treeSet.add(interval);( a, Z# u+ l+ q# b: B3 m
           allIntervals.add(interval);- k( z4 u/ U# V, w, k
      } else { // 单独一个
! c& t# C5 R1 _: _. G+ w2 N- h3 [           Interval interval = new Interval(idx, 1, c);
+ E+ b! C: ?& y4 |, e& ]           treeSet.add(interval);
2 o- D, u5 ]  ~9 i  w: Z$ s: Q           allIntervals.add(interval);
, Y, z% ~( C% A6 L1 q      }+ _9 l! J8 ^, r
/ K1 {  \/ d) {- q! q0 a2 h1 B4 L
       arr[idx] = c;, e8 h8 T8 ?# v! Q; q
       return allIntervals.last().len;
1 C1 I; I- `9 m$ C, t5 \9 [, W  }7 ~* f  {6 u2 q# A: p* l4 K7 I
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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