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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】  F- ?! E4 g; @# k( D$ ~! G3 D

+ u% n0 x6 l; ~解题思路7 p3 [7 g' L& Z& q
签到题,循环判断即可。: c2 F  R% o" n+ z! j# L/ U4 |
+ X# H* K% [/ `: }5 Y8 E
代码展示
! w$ d$ Z: J2 S" z' p
% k2 J- B! e5 h# e, uclass Solution {
* X! C! I) }4 p* [   public int maxDistance(int[] colors) {
, b$ I; n3 N$ q5 s$ z; t       for (int len = colors.length; len >= 1; len--) {/ t, B8 ^, w3 u* t/ ]
           for (int i = 0; i + len <= colors.length; i++) {
- w: L' P! i7 _5 ~* w! J$ D               if (colors[i] != colors[i + len - 1]) {1 k& e2 L; I2 S, k: f+ `. ?, F( |
                   return len - 1;
  O# c3 w% q) h9 s              }
- a/ J* I" {- F$ J0 ^: G          }+ r1 a( i8 X- A5 P4 _" m" j5 g( t& k
      }
$ D2 F$ M; x$ D  q' A/ n       return 0;
3 A  i$ l+ n, o+ b  }
. ]" h' m% t- }, j/ y7 Q! X}8 X2 Q, j' `. h" t3 M6 u' }) i

" B, B5 I: L( T( k5 V* E【 NO.2 给植物浇水】
0 m, l, Z* `& e5 E2 X. v4 {4 d+ Y) B6 k# H9 O9 h% \) x
解题思路8 |; @0 f. Q6 |
模拟浇水过程即可。; f9 C8 O# D$ S

/ N8 i& Y' E; H( d8 t, ^6 c代码展示
1 Q0 S) x, O3 Y. V, S; e7 Z1 `+ Y
class Solution {
6 U; N+ W6 j9 o- L! t  }   public int wateringPlants(int[] plants, int capacity) {  y/ v" O; n& a/ R5 H
       int res = 0;2 p1 Y0 F# ]$ Z: V, v
       int water = capacity;3 L; W; s; y2 M* U9 M
       for (int i = 0; i < plants.length; i++) {
& ^. b" }/ m2 l           if (water < plants[i]) {
1 d9 ~/ h" r+ k0 G- k/ N$ z               water = capacity;
) K* d8 w2 j- h* b' [- y2 G, T6 v3 n               res += i * 2;
& M, D# P/ Q1 L          }
5 u$ H3 e6 R, L, d7 X; H$ v           res++;) b3 g1 U7 ]1 F2 G' d+ l  ?
           water -= plants[i];
# ~% K% ]+ z% _7 P' N      }5 d, A( |+ h- N9 Y  X! L& E" K$ c
       return res;" ]! c  w! S* b( T. f7 t. m
  }
$ s2 a- [9 q, z; O3 j( }) s5 }}& k6 W$ R/ d' V2 t: |" J
: Z; ]6 t( `5 V5 r7 F! Y# n1 U
【 NO.3 区间内查询数字的频率】
, d. q2 D/ X) B+ ~7 l4 f! U" L+ k; [
解题思路( A8 t/ m* [& M( F0 U) ]
二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。9 a9 S% q( m7 `6 ^

+ m8 W* F. F9 ^0 y* A代码展示
4 M2 B  m' |# G
: P$ w$ I- {/ s- ^& A) U+ xclass RangeFreqQuery {
/ ?6 J  b0 E  i! x( T& g   Map<Integer, List<Integer>> pos;8 M) ?/ l  A5 v: ]7 N1 K

6 {( h7 }' b6 _3 T   public RangeFreqQuery(int[] arr) {2 V0 A( }; m! [! H# W
       pos = new HashMap<>();
4 I" Q. Z1 c+ S% {. P) P       for (int i = 0; i < arr.length; i++) {
/ c* C3 h( c0 ]           if (!pos.containsKey(arr[i])) {
  m* v* Z  o& P" l               pos.put(arr[i], new ArrayList<>());
4 W$ N( G' b; R6 s          }
+ [! w$ N% R* T. p  u, i           pos.get(arr[i]).add(i);
$ ]( }8 Y' y1 S+ G- Z( I$ f      }2 R  O6 {- B% m( A6 q4 j% |
  }
0 T' l. v0 j* f! g
2 P2 K( ~0 k; A( u$ J; v0 c7 R   public int query(int left, int right, int value) {* i* k, M1 p- z
       if (!pos.containsKey(value)) {: m+ t/ V8 p9 l' o& R( V6 X
           return 0;: b3 F1 i% ^+ N' a* |- R; l6 x
      }$ N- l: y' u7 Q3 }5 J
       List<Integer> p = pos.get(value);
4 [# s# Z$ o, D" ]: P4 m       int start = bSearch2(p, left);
, K$ L6 g" X7 M6 }! f       int end = bSearch(p, right);6 X: e- J( J5 F" q7 D6 v0 @+ `0 t
       return end - start + 1;
6 Z9 f9 [0 d) [' L( y  M6 T- D  }
2 N) @/ q' `, W; q; `/ P& b; Q
4 ^$ f& R" W  _' H( ]   // 二分查找最后一个 <= value 的元素下标
7 P; f; h# i1 E1 _3 `   int bSearch(List<Integer> arr, int value) {1 M" A- n+ \- Z+ j5 O/ R/ r- B1 o
       if (arr.size() == 0 || value < arr.get(0)) {
* q4 o* u; n' Y3 _! n* ?; n  a           return -1;; I+ v( e( `# `. c
      }8 [( v5 T* A9 ]: b
       int left = 0, right = arr.size() - 1;
9 I. g. n) `( ^+ K$ E- i       while (left + 1 < right) {* W: j' r# K2 O( L
           int mid = (left + right) / 2;% A& y# _5 R) Q1 P
           if (arr.get(mid) <= value) {
2 o6 Z0 L" X' M5 |* m+ S5 m               left = mid;+ W  _: A8 r! M# ?6 Z2 w/ [% e( L
          } else {
% c2 d' a8 A1 G! _# a               right = mid;
7 H( f; b, Z* V8 P6 g( u4 W" e4 |/ ]/ K          }
1 L# _* _, Z3 e2 i! Z* `5 u      }: N$ u, W  ]0 h& j7 V8 i- t
       return arr.get(right) <= value ? right : left;% C3 ?. z  m1 x  v
  }
: r  x$ B5 S& M5 y
; Z3 M. \3 |' }1 }& b' S2 L   // 二分查找第一个 >= value 的元素下标
5 `. \' {8 c; }) g' @   int bSearch2(List<Integer> arr, int value) {
% M( ]4 N% g+ ?1 `       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {5 {$ z3 i% [( t# C1 b& h& E
           return arr.size();
0 n# p1 x2 p1 C      }
5 i0 L, b9 c0 X' P: s       int left = 0, right = arr.size() - 1;
- f$ @* A; `; H" T       while (left + 1 < right) {6 z  }( ]$ ~" F/ x) Z
           int mid = (left + right) / 2;
" N; n! m8 h+ W# p# [           if (arr.get(mid) < value) {
0 V$ y2 I. v- `5 f+ q) W               left = mid;
: }, S/ C9 s# X2 m1 K6 b  m& S9 K          } else {
% Q# S  A# @# u3 |5 U               right = mid;4 P  i2 A- v4 S) `0 U2 \
          }& O  o6 }6 n$ W; }+ Y: f
      }
' Z: x0 q0 N0 @       return arr.get(left) < value ? right : left;
5 X4 I" B9 y; w( C; ~: D  }# X1 p2 N/ z- D& }6 L" q
}
. j( P1 \# v( _+ t! t
7 B6 E% b* x- G5 c* q【 NO.4 k 镜像数字的和】1 N" [, J" l8 _* }7 q
解题思路/ |+ D& G& K# q) X7 B& ?% a
回溯法枚举即可。
; M: J4 f( i, p. J4 B% P
8 Y. P3 q  H. _, b9 w代码展示4 E& }" M4 l3 j5 }" M) f

+ V; b3 y4 x' a1 g; v6 A  Pclass Solution {+ z- h4 y% c2 H3 E
   int n;! a, i8 D* P$ d6 k* ^4 j; Q
   long sum;+ j! u0 j  ^  v3 n; ]( r( \# e

* H7 o) k# T% j$ b6 O   public long kMirror(int k, int n) {6 b1 h1 Q+ D2 Z6 L
       this.sum = 0;
8 K, k: P; D+ R5 ^; n) h" F# k: F* y3 v       this.n = n;
; e' b: \+ k( }- @7 B       for (int len = 1; this.n > 0; len++) {1 \9 \9 E/ T; `2 b3 m2 I( }
           // 长度为 len 的 k 进制的镜像数字& s) ]0 Q9 F% a. k/ ]6 M
           char[] chars = new char[len];
& p8 V. C5 Z& T. O8 v) m# j5 H$ R. f           dfs(chars, 0, chars.length - 1, k);
" U9 `7 s/ C2 }5 x9 Z, |      }; i" R6 G5 k- H: q
       return sum;
: ~- E& \2 |/ S0 ^1 p5 X  n/ Y  }# b9 [7 l9 Y/ m+ k: J" ?
& [) B9 b- Q' Q/ O
   private void dfs(char[] chars, int i, int j, int k) {# H9 F9 |! w+ ~* p3 M
       if (this.n == 0) {9 G, _' M7 [2 p( ~; O4 b/ \& D
           return;
8 ]; t: W1 J! \5 h3 {' a- W# W      }
# Y& i( o7 j% t: M       if (i == j) {9 Y! W0 @" q4 s. f
           for (int p = 0; p < k; p++) {
1 U$ \* P5 V) p# }: p+ F               if (p == 0 && i == 0) {1 \/ J# e6 G6 r; H: L" J. H
                   continue;8 j- T! m$ K" x/ {- D7 P, V% I' t
              }
0 q. s9 K8 v4 l) }               chars[i] = (char) ('0' + p);: d4 {4 V( ~6 ^8 v3 [9 l2 Z
               dfs(chars, i + 1, j - 1, k);, O' `  X9 |1 ?7 l. ]
          }
: X0 T8 {5 Q* L5 D4 W; G           return;
& O# b0 A- ]5 i# G      }2 T& n. u. A4 A3 O; g; E
       if (i > j) {
9 p( @( {  J& d$ N" F  i7 w5 y9 `           long ten = Long.parseLong(String.valueOf(chars), k);% h- \% a; _, n; M  c
           String str = String.valueOf(ten);
- K7 j* M( S' W2 ?* B- L           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {8 \1 y) P- E, K. [
               if (str.charAt(l) != str.charAt(r)) {
* N+ l) j. {0 _' i' |" }! A                   return;
5 E% K! E! J0 y8 a              }
$ H, f* G; {! f1 j" w+ y$ A          }8 c5 D- a6 P) ]$ `" o7 N2 t4 A. S
           this.n--;: i5 l. X, t# S2 ]5 Z) `& N8 T6 K
           sum += ten;2 y# p$ i2 q, g& @! y, ^
           return;
5 M) l+ k6 y5 k3 X      }' v) |5 ~- y) Q) a3 E! S
       for (int p = 0; p < k && this.n > 0; p++) {
' M* h, ]1 F9 T, b" D2 R           if (i == 0 && p == 0) {
5 e' x/ t3 s( H) E. E/ u! S5 @               continue;4 i+ e" o/ n6 H; Q
          }
6 ~3 }0 v( D8 N5 H, t3 X% Y7 U           chars[i] = chars[j] = (char) ('0' + p);
+ S1 ]: ]& S6 _" V           dfs(chars, i + 1, j - 1, k);- J5 o0 D1 u2 V" W( t8 ~' r- @. N0 v) P
      }6 h4 Y  ~: y; f' |$ y3 p1 N
  }5 U9 z! A; w* R$ @. Q5 P/ e* ~/ u
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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