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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计数组中峰和谷的数量】
6 R0 N. @4 U3 j+ L+ z1 `8 t
9 n' a8 s( s% j9 I% p解题思路
6 R' }" ?3 ^- P$ P; ~9 \' {% M# F先去重,再统计。* A# Q+ w- W/ v4 e1 P' b% D' d

3 ?* V5 S2 {# W6 Y6 F: S6 u代码展示
$ q8 |  H6 z4 }3 Y0 m  S, o! q9 S8 H
class Solution {2 \% w0 T; Y) R
   public int countHillValley(int[] nums) {
7 ?* [& B4 O0 v# A3 B       int len = 1;
% v" J& S$ F: p* \. v# ^- m       for (int i = 1; i < nums.length; i++) {
  A! S# M# p! x. ^& \           if (nums[i] != nums[len - 1]) {5 P. ]. \5 t$ H
               nums[len] = nums[i];
- }+ N, ~, [( c               len++;
4 g1 L! y, [4 ^9 k  Q0 a6 p          }
" ~+ Z% A7 T2 N+ q) r2 K      }2 J. m. Y/ n% S7 S0 ?; }
       int res = 0;! X. d* ?) ]: n3 e) ~& m0 I# y
       for (int i = 1; i < len - 1; i++) {) o# P7 G. ^4 R% h* W
           if (nums[i - 1] < nums[i] == nums[i + 1] < nums[i]) {
& ?) I7 X+ f4 ?  c               res++;
1 U* K, j* _, J          }7 `' O" B' x" C( V  [* b5 K
      }
6 [1 e" o& y8 j9 L       return res;
2 U& }1 V6 f* h  }+ }' E/ K* p( z9 x6 t4 t# @4 \$ y
}3 q9 N- [1 b+ _- D
* C/ D7 ~0 `; P/ {. }; w4 s0 A
# j1 T4 h2 }6 a5 k
【 NO.2 统计道路上的碰撞次数】
- \& ~1 ~4 \& `6 I2 U. a! ^9 y8 M, e+ _  s- n
解题思路/ g3 g4 G* [2 Q' |$ V
从左到右遍历,维护左侧的车的状态,有两种:
$ c9 O" |7 i* |% v- t4 P2 U, p+ a3 t$ P4 r/ e- {! @
若干个向右行驶的" {' i5 k8 p# Z4 L  i, \0 w9 p
2 x+ l, R8 z! t: }- {1 N5 h& c
停止$ ?! @' `3 \$ [6 V0 u* v

& ]: U" ?' t* o! J3 K9 R代码展示
8 M+ p6 G" U8 s# B- r2 `. f$ a7 ]8 X9 b" X2 z
class Solution {
4 g) f9 x3 F6 t# G5 {   public int countCollisions(String directions) {, w1 w9 r9 H0 L+ w0 j
       int res = 0;
( }' i: C$ ]3 k# z  b" T! W8 Z. {! v       int S = 0, R = 0;7 X" a! g% d& P4 ?- U* W5 P' i# P
       for (char c : directions.toCharArray()) {8 `( J# T2 Q8 @
           if (c == 'L') {
  L+ c4 J+ t( |7 p8 F- l               if (S + R == 0) {7 F. s3 }0 W9 R  y2 ?
                   continue;* [; {5 _! N- R' ^' w! y4 k8 B
              }
1 c4 t5 T7 e  N. d               if (R > 0) {
2 |& A2 }5 Z% r7 Q- W1 c                   res += R + 1;
1 u- }- ?0 g/ p% H              } else {/ ?/ I, U9 U$ \, M- K
                   res += S;6 Q% P: D4 Q" [) ?/ A- v( j
              }
  @6 J! m' |+ q& J3 n: J# q, P               S = 1;2 Q1 V! b! _# p& x
               R = 0;; H. }+ L6 Y3 w4 ~4 @0 Z! W) @
          }
" w) P! z1 F7 Z' x$ A5 k% D0 V. p           if (c == 'R') {! }: W5 q; u4 o
               S = 0;
( b# z3 I% [; h" R( A8 y% N               R++;2 ?5 b1 x# _. [! H9 `4 y3 Q* V
          }
5 k4 p* L4 H3 g. J# t7 f' c           if (c == 'S') {
) H) M) y$ F( Q' @2 I- R+ g9 r9 d               res += R;6 q' j8 v) h8 X. P7 g" {9 q
               S = 1;
* A4 P5 P+ [4 J! E0 x1 L3 x" M               R = 0;
' p$ o2 K& x9 |4 |$ r' Q. B          }) x+ Q$ W+ q8 j% q( {
      }
7 @) p5 W8 K/ I! @0 l       return res;
1 J! j. H( d$ W2 j  }
( S! n  p7 K' c4 @}4 {$ L% [3 Q4 p9 D
& R# M) Y8 K- s+ F% V  o6 p' {4 \

6 G& o# `7 ^" |+ t- x【 NO.3 射箭比赛中的最大得分】( z6 }9 {9 G# L

' G. L6 g2 h3 B( w解题思路  i* n; ?, [# }) e  n1 T
枚举所有的情况即可,实际一共有 11 个得分位置,枚举 Bob 要在哪些位置得分。) f/ N# p! ]5 A: Y; G. z
+ K( j. a# a7 ^4 C2 P- U: U
贪心地,当 Bob 要在位置 i 得分时,只需要花费 aliceArrows[i] + 1 支箭。" Z% S& P+ N  G3 ?4 d
) g& _7 N6 }; n
最后多余的箭可以放到位置 0.
( R( o: C  ^* I
" j7 x4 E, w, ?" R! ?9 b代码展示
9 D$ [- Q& H" e; i6 g1 Y* J: R7 l4 R0 J
class Solution {
) O+ j+ K) D( }$ N! X   public int[] maximumBobPoints(int numArrows, int[] aliceArrows) {
  b' S/ @* M& C' s       int max = 0;% d3 {( @; c5 u0 b! e
       int[] res = new int[12];
! F! s5 e- ^( u       for (int i = 0; i < (1 << 11); i++) {
- {( l# M" X& I$ ]% {           int num = 0;: f: t% c" l9 E- R6 k6 E
           int score = 0;
- ?; U( _/ _( H5 A           for (int j = 0; j < 11; j++) {
: F1 E5 N* q' u) T1 S9 @2 u               if ((i & (1 << j)) > 0) {. ?; o. k; B. a$ g, J1 ]
                   num += aliceArrows[j + 1] + 1;
8 K9 \) X" S1 z$ C& Q4 ~( V                   score += j + 1;
  z' v, b) P7 I2 n; T              }
7 b3 b0 w; y1 U/ O          }
1 z8 ?3 C+ c- ^" K+ u           if (num > numArrows) {3 O* i4 N3 i  U6 q
               continue;  }4 ^) W" P2 }0 D  ^" s' x0 Y
          }
0 s' T7 E+ Y! |, p/ _- C5 v$ W           if (max < score) {
, l% a8 U7 _- p               max = score;
% @& Z( c8 v1 [, f0 ?' o, s8 r               res[0] = numArrows - num; // 多余的箭
) M$ Q1 I* q! E5 U3 [               for (int j = 0; j < 11; j++) {  Z4 @6 m, z/ Z7 s( \  `" F# @) R& M
                   if ((i & (1 << j)) > 0) {
' i& a( V" N7 [* _                       res[j + 1] = aliceArrows[j + 1] + 1;( M3 F/ b4 w/ w$ J7 S
                  } else {
  t3 U) J9 ~# i' V                       res[j + 1] = 0;: v, [' k6 g% k9 W# ~0 J1 U
                  }8 K* V7 R( C5 F; K( R* J, b: t/ @
              }% j% V. g# u8 o/ {( C2 Y# g# t
          }: E- k$ V2 I) D0 [# _, q  g
      }
& A; Q% Y+ ]$ M( Q# u  D+ h       return res;
5 E! t0 k& U/ O1 i7 w+ O  }. w1 j* b4 ?$ N9 I
}
' a( Q3 m: |! E- U3 j6 V
/ @4 |. ]# o# F1 A( V% k5 x( v" _+ l) \
【 NO.4 由单个字符重复的最长子字符串】
. o* B' v% Z# p" j& d5 d4 L, N/ c/ Y6 M# p' ]0 S) J6 D+ i
解题思路
/ R  L6 H& U  O0 `: p灵活运用 TreeSet 即可,详见注释。- t- d. O0 d, k8 w5 w! G" P+ e( _

% C! u1 }2 s0 u; |! s& b3 Z代码展示  y0 X0 X& q: ?' N+ w

1 o4 @: h% M# F( \! h4 J  x; \- \class Solution {
$ p7 b1 ^5 |+ l! n1 z# }5 b* l$ p4 \. \5 [/ G
   // 一个 Interval 表示一段连续的字符, y1 m8 ^3 j, r5 b8 X4 L& P
   static class Interval implements Comparable<Interval> {* U! d0 I+ Y$ Y9 G: }
       int start;
9 s# {  w& B# z5 ^       int len;: A+ y; l7 M$ p  f9 |) R
       char c;$ z5 J7 F" T6 d1 M0 Y3 Y' C

" u; @: x- _$ C       public Interval(int start, int len, char c) {
% G4 V$ X/ T. [( o2 `( p           this.start = start;5 B/ `7 G7 c& N! u# i* _
           this.len = len;5 n/ Z& B0 l* h" l
           this.c = c;( U2 \* A* ^' n
      }
- `, a/ U! V% k0 D3 n% C. b, f$ J; m3 ?% p: g) Q5 [
       @Override  a. `$ K4 ?$ p6 U
       public int compareTo(Interval o) {
! l% |2 n# r2 t           if (len != o.len) {
# h1 u6 N- [& d               return len - o.len;
) E2 x# S5 i/ L3 X2 [          }" B. D5 E3 L* @4 @/ C! M4 v
           if (start != o.start) {9 \+ s" L# @+ j- x4 D0 Q$ Z
               return start - o.start;3 h: Z$ S( E$ t0 X5 U/ `
          }( m5 q, o: k+ o/ M
           return c - o.c;
8 v# ?2 [* w% W      }% O2 @/ w. R& ]- w- U
  }- @0 i% q2 R3 f6 Z& Z
7 M" P- b" N1 P; y
   public int[] longestRepeating(String s, String queryCharacters, int[] queryIndices) {
( P% v9 Y- x: y0 v( f       // 首尾新增两个其他字符,这样相当于 queryIndices 不会修改字符串首尾,便于后续的处理
- [7 Z, V9 A" q- i& \# D' y       s = "_" + s + "_";
  v- O2 p- s! Q       // allIntervals 按照 len 排序全部的区间
( L! }$ w+ E& u5 u       TreeSet<Interval> allIntervals = new TreeSet<>();
2 Q; s, g% I# o, d       // intervals 按照字符聚合区间,即 intervals.get('a') 表示字符 a 的全部区间,并且按照起始位置排序
' w% f$ p/ U. v) f1 H& A       Map<Character, TreeSet<Interval>> intervals = new HashMap<>();
, C# G: ?2 L# ]. D4 k" A       for (char c = 'a'; c <= 'z'; c++) {
2 e0 i9 X8 K* y/ l           intervals.put(c, new TreeSet<>(Comparator.comparingInt(o -> o.start)));, Z! y6 B4 Q# ?
      }6 W( ?9 @- q3 y+ k# C
       intervals.put('_', new TreeSet<>());
% s! o/ Q1 c# p" j, c- k$ E
& W4 A: o% S8 I2 ]8 h  H, d       // 遍历 s 维护 intervals 和 allIntervals6 _" O5 ]' `- T4 Y+ [
       int last = 0;- O3 I1 r/ H  `$ ~$ y
       for (int i = 1; i < s.length(); i++) {
7 W9 [4 ?4 K1 U; n; {' ^           if (s.charAt(i) == s.charAt(last)) {) e8 q. V( B7 c, w
               continue;) s# R, J! C: O: `# y
          }
+ }3 S& `3 I6 T; }& b1 V           Interval interval = new Interval(last, i - last, s.charAt(last));
& [& C: D4 S, p           allIntervals.add(interval);% R  j1 g8 j2 i; e% N) Y5 t/ ~
           intervals.get(s.charAt(last)).add(interval);
- t1 L9 t; Q; C" E" X$ ]           last = i;% _/ m* P5 s# n- I" ?
      }
. J8 k4 L# f7 C$ Z: p. L& Y       Interval interval = new Interval(last, s.length() - last, s.charAt(last));
7 k. z) s) l* S: r3 d1 m, L       allIntervals.add(interval);
, J2 ?5 b, ~3 }/ w: o       intervals.get(s.charAt(last)).add(interval);
  u; T( {2 i7 _8 E: L* n" }) }3 c
: R3 L& Q" P9 I& r       // 每次 query 调用 maintain 维护 intervals 和 allIntervals" Q  j8 K, z, s. G7 u# l
       int[] res = new int[queryIndices.length];: L1 C# u9 U* H+ y: R
       char[] arr = s.toCharArray();
/ v% L; n1 v. Z$ _* b4 v+ a       for (int i = 0; i < queryIndices.length; i++) {
, ^4 V: z* W8 G# g; f' b           res[i] = maintain(arr, allIntervals, intervals, queryIndices[i] + 1, queryCharacters.charAt(i));* J) m6 r9 R3 `
      }/ V  M9 G# E3 B4 D7 F9 \
       return res;7 u1 _0 L1 D0 x; e5 A+ L
  }
5 A2 M& N8 ^- y# }3 p9 {" ]& ^6 D$ [
   // 将 arr[idx] 替换为 c" x% R- ~) H& n; T  u
   // 维护 allIntervals 和 intervals
3 }, B* L2 u- w0 r% _6 ]   // 返回单个字符的最长的子字符串长度0 p9 n; c" a; X8 y
   private int maintain(char[] arr, TreeSet<Interval> allIntervals, Map<Character, TreeSet<Interval>> intervals, int idx, char c) {& k, U$ ~  c* a- ~  T1 u: [/ \5 j
       if (arr[idx] == c) {4 c- K; s, f8 @, `) r
           return allIntervals.last().len;
* k/ d2 \; a6 }, M5 v+ d      }9 X/ m7 j! G5 W8 [, [8 _0 v
0 w3 G' H9 T) B0 e$ @+ @  I- i
       // 维护原字符 arr[idx] 的 interval
4 l3 L3 I* U  R& R       var treeSet = intervals.get(arr[idx]);
+ ^/ x& E2 ?; I" V       Interval origin = treeSet.floor(new Interval(idx, 0, arr[idx])); // 调用 treeSet.floor/ceiling 时,只需要 start 即可
0 L! \' b& y, G! `       treeSet.remove(origin);
' @0 ~* e" D5 F' N, A( H       allIntervals.remove(origin);
) C% J2 r$ h+ ^' @$ E' i3 R3 C       if (origin.start < idx) {) j9 }/ R8 G1 j% H& ]
           Interval interval = new Interval(origin.start, idx - origin.start, arr[idx]);
* |' ?4 l( Y! ?. V# }3 D           treeSet.add(interval);+ N/ r# ]& k8 ?9 R; B" j
           allIntervals.add(interval);- a$ p. p& d# D$ \; d& P0 s
      }
/ ^' `+ @4 F7 z$ u. C       if (idx + 1 < origin.start + origin.len) {
# T/ L" N+ }9 o- H           Interval interval = new Interval(idx + 1, origin.start + origin.len - idx - 1, arr[idx]);
1 v$ R& [% `7 n! D: \! y, W           treeSet.add(interval);/ ?1 I$ D3 u; |) w5 y1 G1 O9 i4 q
           allIntervals.add(interval);
" p0 c$ \$ T- V2 V      }5 i4 i& _1 h) G9 E7 N/ b3 f
' ^: J  c- g, i# Q
       // 维护新字符 c 的 interval# k- }3 z- T  ]) k" o2 [
       treeSet = intervals.get(c);
8 @5 {; t, d3 a$ S5 @       if (arr[idx - 1] == c && arr[idx + 1] == c) { // 左右连接9 y5 a: i: @( \( N$ E
           Interval left = treeSet.floor(new Interval(idx - 1, 0, c));% g  d2 r9 e- t3 S; _
           Interval right = treeSet.ceiling(new Interval(idx + 1, 0, c));
1 {4 _8 k: ?  h           treeSet.remove(left);
7 X4 V) R5 V+ ?, n           treeSet.remove(right);
. k- T. H7 M: I% `. G0 i3 c           allIntervals.remove(left);
" h, S# d# f. s$ o% f           allIntervals.remove(right);7 @3 D% ]' ?. c. ^- j8 N6 W2 F, A
           Interval interval = new Interval(left.start, left.len + right.len + 1, c);
& p2 m7 {6 Y% X# N* H, K+ k! [' z           treeSet.add(interval);
+ T1 j4 I: w" X3 G8 u0 V           allIntervals.add(interval);
7 b1 ~& g; B6 `% w      } else if (arr[idx - 1] == c && arr[idx + 1] != c) { // 左连接
+ g8 `5 \4 A3 k' g5 J. F           Interval left = treeSet.floor(new Interval(idx - 1, 0, c));3 p* e% Y$ V0 C% M& ]0 w
           treeSet.remove(left);
* D: ^2 \5 c! h) R! |. ^6 T0 M2 M           allIntervals.remove(left);
# K1 H. S3 Y% P; {* A           Interval interval = new Interval(left.start, left.len + 1, c);
0 V$ Z' {: B- t           treeSet.add(interval);) q6 h' P6 q: q
           allIntervals.add(interval);
2 F' |% `* F- L' ]( Y" X+ X3 G      } else if (arr[idx - 1] != c && arr[idx + 1] == c) { // 右连接
3 N' l# V8 I+ s( K( \; F+ R: L+ i           Interval right = treeSet.ceiling(new Interval(idx + 1, 0, c));  C- V( i3 L* m" n: z, a1 H3 j
           treeSet.remove(right);
+ y! N' n2 g' P4 V, V* l6 u) X           allIntervals.remove(right);
" j2 f7 v8 @7 Q. n/ v( v3 W# b7 g; d           Interval interval = new Interval(idx, right.len + 1, c);
' S* H5 k8 I* S' X) w' k           treeSet.add(interval);7 H+ g, x- K3 t9 l7 T6 y9 l
           allIntervals.add(interval);# f/ B# a3 Z$ K/ L5 C
      } else { // 单独一个
6 k% g8 z4 F( \5 @           Interval interval = new Interval(idx, 1, c);
3 ^: {3 z; ~' J7 Y           treeSet.add(interval);9 l& k  b- u! l; D/ K/ C* e3 b" I
           allIntervals.add(interval);
; b' v# i9 S4 r1 l" ~. `      }$ C! v; Z# O; s+ ~4 W( s# L
2 e! U% I6 h/ P0 D, z& Q$ c' m8 ~
       arr[idx] = c;- c+ a% d3 V/ w" n- l6 X
       return allIntervals.last().len;
2 {- X9 |5 R3 ]  }. ^: ^$ j" p2 t
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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