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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】
8 z  ^9 [  z. o" |; c2 Z
& B: ]; f' V9 p( o- {解题思路
7 J4 m. S$ p& o签到题,循环判断即可。# I1 X. R$ C# A# f! E

) d. I! c) t9 E9 v# O代码展示/ K) T, c- O+ _- J* W  O* {

  R! D; S- l( @5 wclass Solution {
* N) H# {  Z  b+ \/ i  z3 N   public int maxDistance(int[] colors) {9 }; P$ x( v9 t' Z" ]
       for (int len = colors.length; len >= 1; len--) {
' D# X$ d, s/ x& c) Y8 @( s5 e, R           for (int i = 0; i + len <= colors.length; i++) {
# k' _" Y! A% I" N& b0 X1 E               if (colors[i] != colors[i + len - 1]) {* y, j) f' A6 C+ ?: d
                   return len - 1;' Q- j( s' L4 L6 D, R1 n
              }
3 M% y' R  T2 Y3 E& Q          }
# q9 u# Q; i' D1 z. c4 C      }: S3 K& _& h! u3 Z# W
       return 0;
# d( u" u$ |# J  }
( e+ M( c  d" ^5 g' c0 K3 e' c) F}
8 H$ C' M7 S8 e" u/ }
- x+ m) @$ m" M9 H【 NO.2 给植物浇水】
( u6 f0 o9 e+ U4 @0 k: Q, Q. N
" }1 p$ \! ?9 K* `: x, h+ O解题思路
& U+ r# X5 g' h, l7 L8 n  m* N模拟浇水过程即可。3 }' _" y9 n8 u- X
9 \/ h7 h( g4 q" n9 h. Q  m. h
代码展示
% C. F7 D) p  X2 y1 `* L5 m1 F
- j* F  m  E( F6 V2 H1 J9 I. E3 vclass Solution {/ l7 G$ R4 Z6 P+ R; f) w" s' j9 ^
   public int wateringPlants(int[] plants, int capacity) {9 P" c2 E8 D5 N
       int res = 0;4 `* J, ~" K8 J3 d
       int water = capacity;
. a" c3 v0 e) l       for (int i = 0; i < plants.length; i++) {
& [+ \8 l# v- F; I           if (water < plants[i]) {  }, B. A: D7 I! f/ y8 O+ u
               water = capacity;! \6 a( U/ X: C+ W4 J& S* n
               res += i * 2;
$ s7 j+ @7 b7 _. h' x$ J4 W          }/ n( x7 P1 t# n; X
           res++;
7 _8 e- m) }$ u. G) X  ^           water -= plants[i];1 v8 _) a4 X8 V. a! t- r
      }9 h: ^! Z4 R  x  N& k
       return res;
  p0 ]* n8 _6 t% M# ]3 X/ g( _2 e9 R  }
8 {) s' I5 H2 y: `# \( T' I+ Z, A5 z}  t, S1 }9 l. r0 h/ o
" T. c$ t; b  p! X  K
【 NO.3 区间内查询数字的频率】/ j8 e" F4 i4 W9 Y/ a7 ]/ m0 D/ D  e

1 H8 Y  d5 V/ R7 e* E0 A解题思路
+ |. U7 H) _- a2 l# M; X$ H4 @8 b二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。
3 p. Z+ r* ^1 h; U) x
, {+ |6 k0 p# o0 d3 a# Q代码展示! m0 o  |! U$ r3 R, Q3 N- z3 H

+ E$ V- V4 r/ g# j0 {) Vclass RangeFreqQuery {! L% h- q' [5 r1 w7 ^! q
   Map<Integer, List<Integer>> pos;
; ^7 F; i. Q% }7 I1 r6 X3 h. }: q7 ]  o" G8 a/ l
   public RangeFreqQuery(int[] arr) {1 A* Z& K5 E( v. H! L( F) f
       pos = new HashMap<>();: @- U% E. F, Q! u, p( K% N
       for (int i = 0; i < arr.length; i++) {
/ N+ q* e) D6 W+ C  x) y6 U$ q9 ?           if (!pos.containsKey(arr[i])) {1 N* _$ n' W# [! D* J' t! C; V: @
               pos.put(arr[i], new ArrayList<>());
* V& e/ H! \- H; ~2 _2 ]5 L          }. i$ g  A2 {+ C7 ^& @
           pos.get(arr[i]).add(i);* i+ F9 {  a) c* q7 i* _
      }
! s4 @. }6 |* P, H8 C3 B  }
. y6 b0 U0 @% l( X# ~3 @, T
- ]0 j" N. ]/ V4 {   public int query(int left, int right, int value) {
. g- ~9 W# D$ J: Z       if (!pos.containsKey(value)) {
6 h; q' t5 A( d: N: n           return 0;3 }  z1 m! S* W& w% b0 }
      }! ~2 |5 v% n# h" j8 ]4 C
       List<Integer> p = pos.get(value);5 G0 e" A" }( e5 W6 A
       int start = bSearch2(p, left);0 R: c; i; L+ d1 M$ b
       int end = bSearch(p, right);' T+ `+ k" q: S) F* }
       return end - start + 1;+ g, m3 F$ R" n4 g
  }* H3 H3 j1 f+ n. ?  ?

* H" z9 u- U4 i4 P   // 二分查找最后一个 <= value 的元素下标
7 i4 u7 K( W7 s7 {   int bSearch(List<Integer> arr, int value) {
" t% X7 H8 Q- B) N; B; y       if (arr.size() == 0 || value < arr.get(0)) {
# @( H* g8 k+ ^2 X6 g& Z6 ?! i           return -1;3 d& c% }" `9 W5 S
      }
% V* `: _! l! G/ d' q- T3 ]  h* z       int left = 0, right = arr.size() - 1;2 ^4 p* h6 C9 x2 e
       while (left + 1 < right) {7 P2 P3 ~; b5 S6 K- S  ?
           int mid = (left + right) / 2;
$ q; X) r' ?/ z: Q           if (arr.get(mid) <= value) {
0 Y: O6 S! s4 u$ V4 R: w( R' ?) m               left = mid;# `' P5 c! q" D( G' n5 v7 b
          } else {
" q- Y2 `% u2 ~( j  ]) c               right = mid;" Y+ i0 y8 Z: q5 c
          }: s$ _. a4 Z7 y5 J( g3 _
      }
; V/ ~" ]" U, Z8 t& G       return arr.get(right) <= value ? right : left;
  {) T% M( Z9 ~. h& f6 v2 z( @  }
: L( b8 s! o% Z3 [! B: q9 F9 K+ V$ s# r3 B, J/ o- T
   // 二分查找第一个 >= value 的元素下标1 x+ e1 D( ]/ M# j# i: ?- O: F
   int bSearch2(List<Integer> arr, int value) {# F* g* D  n0 B, `6 o
       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {3 P% A2 E- y8 O* g0 y
           return arr.size();4 L& Z7 l# ]9 _' `% r1 M- I
      }
/ a+ d$ @4 X2 e) `: E# o& A       int left = 0, right = arr.size() - 1;
3 u+ ?, V* S1 e9 J, n$ ~4 f! y( q       while (left + 1 < right) {2 Q/ X. ]9 y6 B
           int mid = (left + right) / 2;
2 a* U9 n- x, U& b           if (arr.get(mid) < value) {
' @, c' I  X( I; R. N# g               left = mid;
/ @/ N" K" j: p% a2 q4 i          } else {
/ M+ `; {& P7 R" B7 E  A               right = mid;
) z5 D/ Q; G$ {1 S          }
. w0 j% O3 g% F& f! ]* G1 z  }* Q! l      }2 Z# f0 T: O2 S. z6 p
       return arr.get(left) < value ? right : left;5 |2 f: L; h( a! s
  }. [, L% u( C, j+ r
}
* |: J+ N$ J5 Z- S5 C) Z' s: G/ G+ N) c) A
【 NO.4 k 镜像数字的和】
% i( J& ^6 b6 [9 h2 X解题思路
# i# o4 Q$ g8 z+ f! a) ^0 p回溯法枚举即可。  K% }  S4 V& R

7 M7 |- A0 [9 C" `代码展示
. L: W2 r5 V  H9 }% D/ Z7 m+ `# x; D( G! E( R
class Solution {  Q: l0 H; r9 u4 f& \
   int n;
- x, u, n3 t' @: M" e0 K7 s   long sum;0 p6 b& W$ s$ L/ _

/ J$ f" o+ D: @: ?   public long kMirror(int k, int n) {
' v  \* V5 u; y9 z, J# J) ^! z/ B; z       this.sum = 0;3 m; `9 B2 N, R. P8 d# F; b$ L, V
       this.n = n;6 }( U7 N, p: I
       for (int len = 1; this.n > 0; len++) {! m$ n. [: A6 D$ d$ C7 Z
           // 长度为 len 的 k 进制的镜像数字
& z4 f8 Q. ~7 j           char[] chars = new char[len];6 K# O( F% T  J" E
           dfs(chars, 0, chars.length - 1, k);
+ }6 ?1 k1 \; y6 j/ u% A  e      }
( m: Q7 U6 ?1 _       return sum;
4 H; |; h8 }; {4 |. H6 v& Z  }: j* a& z9 n6 Z: c5 W
: F* S% g  F! m; B$ q% z
   private void dfs(char[] chars, int i, int j, int k) {  @; X! Q" J- W3 _  Q+ \( O& g
       if (this.n == 0) {* {1 t6 P3 D( `2 z7 J) N
           return;) L( L$ Z/ o6 f5 o
      }
& L8 u' d2 k: J       if (i == j) {, p2 E) i% P6 ~# `& Z5 w8 |
           for (int p = 0; p < k; p++) {% Z( B6 d6 M% R
               if (p == 0 && i == 0) {
* C- x8 u9 N$ Q  ^1 u                   continue;0 j+ z" N( f: C5 u) |1 s* X. ^
              }
6 f, H; a7 t/ c% s1 y               chars[i] = (char) ('0' + p);
: M6 z6 \+ e' h  P* G: E               dfs(chars, i + 1, j - 1, k);
& X4 |' u* i+ C+ c( [; M. ?          }$ G  o4 O5 D1 l1 y, o
           return;0 @( E: w( h& `8 ^$ w
      }
( ?7 E9 m& j2 T! Y: m* }, l       if (i > j) {
1 _  I* v  I6 X           long ten = Long.parseLong(String.valueOf(chars), k);
8 f  W' U. @" N" g  u: p           String str = String.valueOf(ten);
* N/ p! W' i/ S/ l' W! T' S: q           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {
: \. R, S9 I' p. x# J% h' u               if (str.charAt(l) != str.charAt(r)) {
4 f9 o9 `7 j4 A                   return;9 Y6 u) ^" U5 D( M0 K
              }, H2 s" g3 n3 i2 T$ E9 g4 o6 J
          }3 e* N0 ~% B: B2 u, C% i  A  A
           this.n--;" P; \4 {3 ?1 w: j
           sum += ten;8 L8 o! }( O0 c4 M- v
           return;
$ q% u' W8 x8 S9 M* V0 p      }
4 B; U8 K5 D8 I6 I       for (int p = 0; p < k && this.n > 0; p++) {
6 R( L1 O8 W4 [, \# b% U$ X* C# L           if (i == 0 && p == 0) {
3 P- }& P1 s! u* \4 F/ H7 n               continue;
$ n' B3 s+ |( W/ J  c$ D          }; k' |! s' @2 W. P: h
           chars[i] = chars[j] = (char) ('0' + p);3 ^& j8 y, N) L6 N( H; ~# s
           dfs(chars, i + 1, j - 1, k);6 v; K4 z$ M6 ?  I
      }
7 O3 `3 e- H3 l2 k+ J: W  }
6 w0 \4 c' ]& E+ _' R; J}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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