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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】
! a0 Z) M& D9 Z- j) r
1 U$ E( J1 T; [5 ^5 z! U6 G解题思路6 D* h/ s4 r2 w; {& G2 e* i; y$ Z
签到题,循环判断即可。- }9 i* W3 ^- X, U' d- ]+ \
4 H! n% @, b+ Y) \6 p3 `
代码展示
, u; H# _, k! A3 d8 @9 J: w( f+ c3 N  U! T4 V7 }4 h4 w2 ~6 j+ y
class Solution {
3 E4 [' r; t) P0 [: ?& E* i: z% C   public int maxDistance(int[] colors) {
: _. \* F' W( j       for (int len = colors.length; len >= 1; len--) {* ~$ _/ i  r+ R! c
           for (int i = 0; i + len <= colors.length; i++) {; r+ L* e" Z1 w0 Y) {
               if (colors[i] != colors[i + len - 1]) {! G8 d' Q) A+ X9 }
                   return len - 1;
1 w' z& X6 V2 B5 V' v# g  |              }5 E5 \" J( Z$ H" e' ]% G4 j) F
          }: U0 A2 p& z" E4 P* r
      }5 ]/ X, V3 L* W, X* X$ Y/ [
       return 0;7 C. g6 c2 e9 W+ _9 a  A1 ]5 \
  }2 J9 _8 T$ p6 U) O' J! H3 L
}
/ t' s: Q4 O! @, D
' {" J; v0 Z8 ^  M【 NO.2 给植物浇水】/ J7 X7 M" W0 O. L( g2 a8 }
8 k2 d9 ]8 o$ K" ?& m
解题思路
! z( y7 x# K4 c8 B; i8 y" k. j2 }) ~" e模拟浇水过程即可。/ B6 L/ n, M5 Z( Q+ |; H

7 G  J; P. D) e+ x: n$ Y( [代码展示
4 m, d6 ^, d* G2 [
) h. T0 e* t( w  G  J6 hclass Solution {
" d  R! q1 f$ W2 ~   public int wateringPlants(int[] plants, int capacity) {1 y  L" d1 S3 n% e5 D
       int res = 0;
% H: M- g& S8 e2 C% K1 T       int water = capacity;
$ N% J8 P6 b" B) Z7 k% J* x" H       for (int i = 0; i < plants.length; i++) {
8 u* `! S/ m6 A$ Q$ [           if (water < plants[i]) {# P/ b7 T6 {* h0 K5 I5 V5 G
               water = capacity;4 K$ \- z- v5 X2 P7 P
               res += i * 2;
+ r* i$ K# [$ p9 n  u          }$ D. W% c* n' l" G, @9 z' [
           res++;
5 `: Z) u5 r9 A9 g4 Q- b. s* z           water -= plants[i];
6 b6 b( H% ~4 a# u1 b      }, x& J" T+ |, d2 G+ n
       return res;
; m. t, ?  ~; X# Q2 y; O! O  }8 U6 [# ^% S6 Q
}5 D* A$ A8 {- [6 R( z
1 Q, y1 K9 u" Q& g- ?1 M# S
【 NO.3 区间内查询数字的频率】
4 C# S6 ?- Z% x5 B% G2 `6 V3 b7 J
9 ~( H/ f( ?) ~+ W2 c4 q解题思路( V8 p! J2 P9 Q3 Y$ h6 m  ]
二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。
  J7 ~6 R; T: b* q4 A3 D  r) p7 |* h9 L% D& ]
代码展示' A  K. P1 J7 d7 U4 J! q5 O8 n

4 s+ ]& @5 j4 U) Q: z* }class RangeFreqQuery {. f" T" E% u- T
   Map<Integer, List<Integer>> pos;
+ D, s9 e' \% ?2 t  v% z; [/ d$ x* {7 F6 r' ]7 ^
   public RangeFreqQuery(int[] arr) {5 q4 x" X4 M3 D! u# f- x, q) N7 P
       pos = new HashMap<>();
& P% L5 o6 s* Z; M       for (int i = 0; i < arr.length; i++) {
! Z) G6 ?  u% G( I1 t- N" }           if (!pos.containsKey(arr[i])) {
2 P& m0 R2 E0 H/ f# y/ B" A0 |- s$ i               pos.put(arr[i], new ArrayList<>());+ o, n" V  P& d: _. Y, i8 I, a0 @
          }
1 t( }0 B' K  T" m/ p* ~7 L: v           pos.get(arr[i]).add(i);
6 i7 a1 e& r$ `4 M& I+ g. {      }2 Y( Y3 n" G( @+ H& @: x
  }: u5 l5 ^3 D! ?1 d- ]

! x: ~. J1 Q+ P9 j. b2 i7 W4 H   public int query(int left, int right, int value) {
6 m4 u. H; `/ I( ?; m8 ?' C       if (!pos.containsKey(value)) {  S" ~, r3 b! l: f; u# a
           return 0;
% l1 u  J" V$ S! `8 Q      }
( A, n7 J( D+ f. T& `4 Y% n       List<Integer> p = pos.get(value);
! Z+ I# K3 \$ o6 a       int start = bSearch2(p, left);
# x. G$ }: B" [* g% M/ A5 [; ~' {       int end = bSearch(p, right);
/ C4 M" k+ z( i. x2 Z       return end - start + 1;
' Q8 i1 _* I, v# m! ]  }
1 _. V  g' ~; y, X% N0 [8 X# x! c' U9 _+ x8 g9 x; e6 M
   // 二分查找最后一个 <= value 的元素下标- [0 a2 O" X# n: A4 G! ~8 W6 q
   int bSearch(List<Integer> arr, int value) {. `! E' b2 Q+ r" |
       if (arr.size() == 0 || value < arr.get(0)) {
0 L4 e: a/ j+ o# @" H$ Z           return -1;% _) f: F0 f0 ^. P& v
      }
+ f0 c8 D0 t5 |/ r0 @! Y       int left = 0, right = arr.size() - 1;9 K& h3 g: |6 C# w5 i; H" `" _, K- e' x8 j
       while (left + 1 < right) {( I+ G8 ?, N$ B% ?" x
           int mid = (left + right) / 2;
9 r$ ^- u# U: c; v3 T0 o           if (arr.get(mid) <= value) {3 p* o  O7 U: d" `1 F" Q* C
               left = mid;
4 k  ~5 U1 ?8 f! _" V& {3 c$ ?0 |- `          } else {: a: q: q. j/ I! o6 G% f
               right = mid;9 J3 `7 |! ]2 ?4 a9 g' Z0 {3 l
          }
. e$ a6 m* |; Z- J5 T      }
7 F. l2 E+ M& `0 [9 P       return arr.get(right) <= value ? right : left;8 J/ k0 D+ D$ n6 n# S: ]1 f
  }7 U. n0 ^+ |& ]: ]- s& {4 Y& z

8 y% W( J- [' O. C  f: N' Y   // 二分查找第一个 >= value 的元素下标
! k$ Z, n5 w2 Q0 ^   int bSearch2(List<Integer> arr, int value) {1 U* G( w: A) K8 }/ [! A
       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {5 p$ x' W" j2 O4 S
           return arr.size();
5 q3 Q. I/ R' R- g/ J% T      }, S4 Y, N2 k% i$ E) h
       int left = 0, right = arr.size() - 1;( G- @! |3 R/ C- c7 W9 D; o' _! v
       while (left + 1 < right) {
' f7 c2 m0 T% V7 i1 K) X           int mid = (left + right) / 2;
$ V+ x7 h. W3 j( I' V           if (arr.get(mid) < value) {: y- ]0 I/ @( [' r' [; Y
               left = mid;" T9 K8 S4 \4 H. U7 n4 K: w
          } else {6 @2 ]- ^6 W5 r& d" v; O7 o
               right = mid;  T6 Y1 f+ `2 ~# m3 X$ Y/ \4 S( p
          }
( L9 L, D9 D: j3 s, \      }
3 }- m- B* A8 |6 k0 \' W       return arr.get(left) < value ? right : left;4 Q5 f6 Q$ ^: E  [! P* ?
  }) A4 M9 n0 H' A, F- O
}
- J. C3 b: S' {
. b, n8 G7 j" Q" q【 NO.4 k 镜像数字的和】
, U2 K. f) {6 ^% g解题思路
( o+ f% t4 F- K! J* `7 h6 {4 k0 s9 Y回溯法枚举即可。& g+ h- W8 t! E; o' O8 r5 ]" A2 ?5 A3 L
; M" W1 z) D  Q7 x# ]% \  v5 j- T
代码展示
- _/ |+ k8 T: O( G6 @+ \- n. |2 i7 w6 d2 ]* R% M
class Solution {
* w( j" \! o  `7 x+ Z0 s( F& X+ R1 F; K   int n;
" O, Z5 o. N# R7 W: }   long sum;
  c; o+ X: F/ \8 y' c- N" y+ P2 e
! z( o6 c3 B2 j- u   public long kMirror(int k, int n) {
* ^! Y# I6 c3 ^0 h" [- L" B       this.sum = 0;5 y' O8 ?+ B9 B" V1 N6 H
       this.n = n;7 W/ G4 a) ?0 |6 T
       for (int len = 1; this.n > 0; len++) {1 c3 M1 w8 K  u8 T; p
           // 长度为 len 的 k 进制的镜像数字
- \* y% e. j+ B" b6 d) V& @: e           char[] chars = new char[len];
; c/ j& k$ f7 B( `           dfs(chars, 0, chars.length - 1, k);
) i! v: g4 ~" {) }, ^" t      }
$ n9 ^9 i" e+ K0 }       return sum;9 `1 \  j, q; j; t* c/ X6 g
  }
% ^2 U& b6 B! x5 U/ U' A
% b# G) t; ~) A, J# z' |8 n0 |   private void dfs(char[] chars, int i, int j, int k) {
5 R' r% h3 Z. ^8 i9 o       if (this.n == 0) {, v$ @9 {7 c) e+ Z8 Q% \! p
           return;: d, D2 o; e0 u
      }; h: D% Y9 x0 Y" H
       if (i == j) {
& T0 t+ S- C9 }4 m, R2 M( k           for (int p = 0; p < k; p++) {
7 Q$ L  B* o5 n3 w7 H               if (p == 0 && i == 0) {
8 i% u/ H! V, s0 s8 ^% E                   continue;
& U+ C! [+ T, R0 ?, u1 M              }" @  g( ?3 Z- @% ?3 N
               chars[i] = (char) ('0' + p);' t, j7 t0 Y8 t3 N- }% P
               dfs(chars, i + 1, j - 1, k);: q* ?& N* d; c, |
          }- [% v* r" ]) X1 p. @* K
           return;3 J& H0 n0 M5 q
      }2 k+ }/ ?4 Q0 y# t; ?3 e/ d
       if (i > j) {
$ R* z2 U+ K$ x3 q           long ten = Long.parseLong(String.valueOf(chars), k);& w( c. i- k" e, G( h
           String str = String.valueOf(ten);4 n5 t2 T6 m- F  c1 {( F
           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {
1 k6 m/ c. t  U               if (str.charAt(l) != str.charAt(r)) {! M8 S+ [  `" J+ H
                   return;
" |9 a# A! h* F: Z$ {. K              }
0 p9 m, c8 I4 w* @2 k; Z          }& \% |  }8 n5 y" p# {5 A% c  S
           this.n--;
6 B0 S: P5 B6 P) q* v% t           sum += ten;
% L) i7 n0 s0 q' A6 Q           return;
5 G, k- h2 {: P& n& M      }
3 G5 }! [4 U6 j; d  J3 A7 S# W       for (int p = 0; p < k && this.n > 0; p++) {
# [. ]$ t- s6 g. l  f/ T           if (i == 0 && p == 0) {
6 p, ]+ W5 J- }, b6 K               continue;
& m& c2 [( V5 V3 o7 B7 H6 U: D3 T5 z          }
! c( T+ f9 m# M$ g! q           chars[i] = chars[j] = (char) ('0' + p);& z( k; g! g# M& Y9 e0 p* \
           dfs(chars, i + 1, j - 1, k);1 T, A6 l/ x0 [" X# _$ z
      }, B" [) }' O( U1 \3 R& o$ u
  }
. ]: e7 Q! @+ u$ v* O$ S1 l}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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