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

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

上岸算法 回复:0 | 查看:3219 | 发表于 2021-11-21 22:28:20 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】5 m5 H& A0 i$ u; j+ P9 m

+ e& g, L3 T9 X  P6 g; y6 Q解题思路
6 Y; V- P1 m  L! I! a4 V- A( k' |签到题,循环判断即可。7 B' F. Q! K% J2 t* Z% K' v  Y* a* |
0 m! p+ |* y4 n; M! r" }
代码展示' H: ]& v$ @& U- W
6 _1 \4 [/ P- }% d& ?
class Solution {
( K6 h2 |) P/ h$ M   public int maxDistance(int[] colors) {- k* }: ]  u" y% ]; M1 z8 J$ o8 e6 z
       for (int len = colors.length; len >= 1; len--) {
! s; X! R' g; D           for (int i = 0; i + len <= colors.length; i++) {% D3 T% O' L, M/ V
               if (colors[i] != colors[i + len - 1]) {- r7 H3 e# n, [" s2 s! ]+ w% {
                   return len - 1;( ?/ l2 I0 ?. I5 g+ r9 B
              }; P: c/ c$ ?* \& e7 I. C1 T
          }, F( I& O; F) j+ N
      }6 |' Q7 a( U. j8 k% ^
       return 0;
4 L9 i/ x2 ]# ]+ v  }5 f& l; r6 t; m
}
& E  @7 B0 @% w5 V5 I
8 i: s" [+ t* ]1 M+ p【 NO.2 给植物浇水】
9 n& B  z8 `. K2 X' ]) ?  J! u1 O7 s# D: n. ?7 I: X& J0 I5 m. m/ J
解题思路
& x1 x  M% y# I% V$ C模拟浇水过程即可。
6 _' _$ z! N1 z+ `5 z* _; t2 m$ K0 N3 ?9 ~
代码展示: M. a  a8 j8 f% ~2 D8 w$ R

9 F, O9 m7 k" B0 a+ Z" X( wclass Solution {
! [" K0 J9 g+ \7 M% w; F   public int wateringPlants(int[] plants, int capacity) {  l* ~: C. U& V% _: }% ]5 k
       int res = 0;
0 y7 U( t+ U9 c' I       int water = capacity;1 C( ~9 I. i* X9 [: C3 D' N
       for (int i = 0; i < plants.length; i++) {# x% q( o% a5 k2 G* t' p' S5 f
           if (water < plants[i]) {+ B6 v6 x4 m& r; @0 Z, X0 u
               water = capacity;
  G) M: N& n- S' Y3 o$ i9 v" q               res += i * 2;
0 B  l/ n- `  F: g. M          }
8 K& Q3 E! D% ^5 V$ z& }           res++;5 a0 W  J, J0 D/ x4 Q) {- R
           water -= plants[i];
' H% e6 d3 w7 }  h* m( `      }& p4 x& K, C, l$ ]9 Z6 w
       return res;
+ r+ E+ J+ u0 b  }
' R/ b8 Z8 ]" \3 J; B# e- r, e}
: w, B9 y# ]. q0 E5 T% J! E; x0 g& C3 C+ O2 n# A. C1 w/ g
【 NO.3 区间内查询数字的频率】7 U6 I3 t; {2 z
3 s! j. j: M$ |
解题思路
) F4 A0 B: A0 t2 e二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。5 ]/ Y( S: [" O* p2 e. `  z) p% @8 v
' r, t/ S, z1 q4 g
代码展示% A' [  |) t7 E

5 C/ U- \2 \! M( y5 Rclass RangeFreqQuery {
$ h" ^" `0 S5 |8 T1 q& Q& t   Map<Integer, List<Integer>> pos;
) j# e9 Q+ A5 U" W5 L  _( l
; |% A/ E& Y2 Q& d8 p$ h   public RangeFreqQuery(int[] arr) {/ x4 b  `. q0 c) M5 ]8 k; _
       pos = new HashMap<>();
9 ]3 L8 f/ r5 O/ ~/ l" X8 \5 c4 d       for (int i = 0; i < arr.length; i++) {
1 }$ ]: |) O. _3 b           if (!pos.containsKey(arr[i])) {
" A# d3 y; `; M- o9 v4 V               pos.put(arr[i], new ArrayList<>());- t, i& G6 u) I* F+ R
          }$ v+ m9 c( T- q6 p6 _+ f
           pos.get(arr[i]).add(i);
, y- N- `8 k7 b. \* x1 n! w6 |      }  p  ]/ Y1 W, Q8 [3 I# f
  }5 X4 B: u3 D+ z( O- p

+ @  D+ t9 j. d   public int query(int left, int right, int value) {
- T$ P+ n4 W4 L, H3 f       if (!pos.containsKey(value)) {
5 H* A8 H5 y2 l           return 0;# t, a9 V. N8 s4 K; O
      }! _* @0 d7 ?* q* C
       List<Integer> p = pos.get(value);# e$ t( h* r5 Z
       int start = bSearch2(p, left);1 H' `" A" I' C. ^& b' s+ m
       int end = bSearch(p, right);
* j" o9 \9 |( _! v; r9 \4 X       return end - start + 1;3 i, M9 f& h' y/ z" K( o
  }5 z4 A& U( i* K+ B1 s( q1 E: W7 f0 \

& ?; C! @' b% k' |   // 二分查找最后一个 <= value 的元素下标, l5 O) v! d/ K5 J8 m
   int bSearch(List<Integer> arr, int value) {6 _* i; ~% ?' R. B
       if (arr.size() == 0 || value < arr.get(0)) {
- E: n1 ~& o) f& O6 V  \' k           return -1;, ]- N; B  o8 m# l( p( r# g
      }
& P) r5 |' n; ]( Y9 Q. c       int left = 0, right = arr.size() - 1;9 @( T% a2 z' m2 z7 i
       while (left + 1 < right) {
6 u8 g, t+ p8 J5 W& d) A' `           int mid = (left + right) / 2;
, S* o; s, b, L- A5 ?           if (arr.get(mid) <= value) {7 ^* \$ U6 z! s/ q( h5 E+ v  N
               left = mid;2 F$ Y5 R+ ~6 D/ e+ P; _
          } else {
& K9 @, R& g$ N% |; B4 V# }7 `               right = mid;' `, J. V0 ?  m" A, \0 x
          }
: v! V' I8 z2 K( l" y5 a: G1 D      }' \% u9 K  i: j! k' K
       return arr.get(right) <= value ? right : left;" ?0 N+ ]0 T% s9 i
  }* g  o0 ]' R2 u5 w
- a! c- w( c2 n# C; M! ]% U& P/ x
   // 二分查找第一个 >= value 的元素下标' ~, z( P" e- g
   int bSearch2(List<Integer> arr, int value) {# u/ j- S7 E9 U: K2 @6 M" c
       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {
3 z0 y2 q& H) F  X) \           return arr.size();& s& `4 |/ B2 @' X
      }
4 I$ t& t* i- J& I7 b1 J  v       int left = 0, right = arr.size() - 1;# r1 U4 p9 j% N& N4 O* ?/ J2 N
       while (left + 1 < right) {
- N6 i& a1 A! Q" x) L* r           int mid = (left + right) / 2;
8 L( X, V/ Z4 R% O" N           if (arr.get(mid) < value) {
0 f" Q: }( ~+ P" \/ X; ^9 j; H/ u               left = mid;' _# U9 _' e" f/ B; I+ h8 S) ?
          } else {* T8 B- _2 M1 u4 [
               right = mid;
& f4 y  z6 F% B          }
/ x3 [+ {6 f2 V6 T. O2 Q( X      }
6 S+ l3 c' m, a       return arr.get(left) < value ? right : left;
: G* a/ W( \9 u- T  \. }7 Q2 Q: A9 t  }
  [8 ^" t& v" a}8 ]5 R& _4 \/ l" M  I- _

2 {2 u5 o( W5 B3 }  D  K( k【 NO.4 k 镜像数字的和】* l/ T% {+ M" P2 X! O2 h
解题思路
& e# V! F+ `* L, O6 h+ E5 V6 {( L回溯法枚举即可。
: @9 b3 ]; y  ]( N+ C6 K7 V- r( C( _" _# B) r$ e! i
代码展示, o  j  N- i/ J) T4 W* ]0 p

% K) V% T& @* i3 f* h8 Fclass Solution {' ^. x, ^. ]$ U3 R/ p* ]' {3 h
   int n;. M1 t$ F3 ^) P3 W: N6 |) A
   long sum;& j" n* t) _- O6 B
5 L/ F+ n1 ~2 a3 V3 J& i* L) o$ y8 `% x' H
   public long kMirror(int k, int n) {: `& t* w: y% G$ X$ D, ^
       this.sum = 0;' G5 L# M8 }( c0 G( z+ M9 _
       this.n = n;
$ C" `: J) B9 \# ^       for (int len = 1; this.n > 0; len++) {
; W+ M( }; b1 l$ w2 D' D           // 长度为 len 的 k 进制的镜像数字- l: W* q* C6 N- g/ v
           char[] chars = new char[len];
# X# F7 O8 v0 B3 U) ?$ {. n           dfs(chars, 0, chars.length - 1, k);8 t6 R* {' B' ^- f% G' T3 Y
      }, I6 M6 K" ^) d
       return sum;
9 d6 S8 C) g9 U  }
7 r/ V6 x1 v" m: t4 t0 T5 G
3 a$ _8 P, I. r# E+ G5 i   private void dfs(char[] chars, int i, int j, int k) {4 V5 G/ E# L( b9 @! R6 U
       if (this.n == 0) {3 L8 R5 _& K( s& q2 j: ?) o  t* y' B
           return;
* ~! \% _6 ]/ b6 F6 o# Z      }
) u# Q2 ~. v0 Z* j       if (i == j) {
* \& U5 ^) w/ y; a1 C           for (int p = 0; p < k; p++) {
0 o* C0 L- H" R" Y               if (p == 0 && i == 0) {6 g4 |5 U+ T8 S9 W0 j' |1 h
                   continue;
" c, j2 M/ w: g" K3 w# F+ c              }3 `* G# I% A& T' i5 A+ |- k
               chars[i] = (char) ('0' + p);
; j1 ~' D9 {$ r6 F8 Q2 n: X3 s* U               dfs(chars, i + 1, j - 1, k);5 C2 s. Z% _% @
          }
4 o1 t3 E% [6 v$ T/ i           return;' g! {) _# s" R
      }2 g5 U7 R, D, T2 F* G
       if (i > j) {: M& f# z! I. t: {) G9 l2 N
           long ten = Long.parseLong(String.valueOf(chars), k);2 O8 {  Q% @4 k" J; H
           String str = String.valueOf(ten);8 ~  Y2 b5 e1 W+ r# d
           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {, \( d' i5 C! \, K
               if (str.charAt(l) != str.charAt(r)) {$ u! w  g! ^7 L5 c
                   return;% u3 H9 Z) I. X9 `
              }
! w4 U$ n! \1 l. Q/ Y# ^          }
# C  w# O. T# S. e* ~: Y/ @/ T           this.n--;6 d( v+ N& v2 i. b2 p& W7 w( g" x
           sum += ten;
' r9 f+ F+ a! m           return;. E$ u( l( s( }9 f$ I  j
      }8 i8 P5 K1 X7 Z: g4 S( T4 t
       for (int p = 0; p < k && this.n > 0; p++) {. N; x$ J7 L! T4 h, U9 }8 y
           if (i == 0 && p == 0) {
2 ?! r; P% \* l9 a* q& q( u               continue;
9 T9 q) U$ \8 b  Z# h/ B* y0 X6 L          }# ]6 T: g( G# C- O( p& [8 M. N  {
           chars[i] = chars[j] = (char) ('0' + p);' n8 e6 i1 |+ y1 k8 ~4 Y8 [/ ?, \( H" \
           dfs(chars, i + 1, j - 1, k);; P; S' x! X3 e
      }
0 p) u; _" l& }& O- C* m. ]9 Q  }
2 r! F1 k9 _+ Q+ C}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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