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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】
* o) }+ K6 A" N8 U! n" C& U, w8 |* S* g# i
解题思路) i3 |7 S  T* ^. {
签到题,循环判断即可。
  d* B, Q3 t8 Y- Z6 X. Z# R2 }5 A. E' c  D. n! y9 u  s. Y
代码展示3 ]* O" r3 R5 H; D! b9 P( n

$ z1 t2 P3 Z5 m: P. s9 _class Solution {
( K% \( S& J7 `! k" w" V% s6 [   public int maxDistance(int[] colors) {
& o* {' C" `: r! W6 i       for (int len = colors.length; len >= 1; len--) {
; A# C+ O& R2 v! p, ?; X! c$ r' g           for (int i = 0; i + len <= colors.length; i++) {
+ H3 J9 r( G! J- w               if (colors[i] != colors[i + len - 1]) {
% c$ w3 _: ?" o& y* s) O                   return len - 1;" k" Z2 H8 s8 T+ W" ^" l0 c1 _
              }
" Y  f. J* w) v" l% l          }$ M: W% T) R5 ^& r* `
      }
% n9 q. `# C( ~' s       return 0;0 n4 N$ n) B! \+ M( f5 L) m
  }
; f5 t- ~' W( p, v2 _* g; V; B5 g}
- r# Y; @1 X) d! }" M$ h
& t' E0 f2 U- l【 NO.2 给植物浇水】; ~6 m& |  J! q! T2 o
6 m% _& i2 ]/ l7 O! Y8 K6 ~2 Z
解题思路
, G; v, `; |9 b( E模拟浇水过程即可。
' I0 C. Q- K" s# V" W& |
' ?0 ]( S0 i9 l( j代码展示! u0 B% q- i- ^& J9 `. S

* |& p$ U7 u% I3 w1 D# [! b7 \class Solution {+ b% E# r7 v7 u$ H; r5 f: |6 i
   public int wateringPlants(int[] plants, int capacity) {
6 I: {" T3 \7 @8 D       int res = 0;
/ C# m/ K, n' @( x- {4 {       int water = capacity;
: L2 [8 k% @& `3 o& L$ y  A! u       for (int i = 0; i < plants.length; i++) {
, ?4 a0 d% f' k& E6 L$ F1 m           if (water < plants[i]) {
! \5 M) ]4 C7 w- n1 Q& _3 E               water = capacity;
- U) Q7 Q- u/ C, m2 e) u/ r9 }               res += i * 2;7 D3 e( D  Y9 O0 W1 Q
          }
' m: y( G" j+ n8 S1 j' [5 a           res++;; R  C  y" c; m
           water -= plants[i];4 }8 i- f. J8 i. @8 e8 U. p
      }
6 w8 h% R9 h! q. X! d: U       return res;
  f; R+ k' @$ `! T' s9 M3 A5 l  }
7 g; x# Z5 A1 M, I' n5 X! M" x( L}( [% j6 b' J( e4 K7 b

2 ~4 T) Q4 v: q) d, F【 NO.3 区间内查询数字的频率】( g3 [  q5 ?: F5 Y8 @

- A, h/ G, O/ f; y, c& _解题思路& \1 M1 ?$ P1 Q) T( }9 S
二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。" g7 w) i0 V/ ]9 K% @5 D- V
4 P: P+ K; h& m1 r
代码展示" K$ t8 d2 w: }# A+ q( ^

! P( z, @4 o* r9 G: i) s5 Pclass RangeFreqQuery {" C9 N7 ?  T, r' K. p
   Map<Integer, List<Integer>> pos;' t% ^! m& n! }( A! g$ i4 x
6 }$ G* S* k0 v% N4 N$ m
   public RangeFreqQuery(int[] arr) {
* x: B) U% s& x8 n' i) o2 c. {       pos = new HashMap<>();
" E* g7 G( w- V, U$ ]       for (int i = 0; i < arr.length; i++) {6 y, b- V" b& c5 k& a  i, X
           if (!pos.containsKey(arr[i])) {2 a3 T% S: O; @" t4 k; T
               pos.put(arr[i], new ArrayList<>());
+ {$ t9 _! ^0 Z          }3 M( s) z5 G7 }2 i8 R# W
           pos.get(arr[i]).add(i);
/ O+ D2 t5 @, T" X      }' {) H* K+ T& Z8 ]
  }
2 u2 m  R  b$ F- }( e% a3 d- A: y2 f, D3 N7 E
   public int query(int left, int right, int value) {5 x2 @  j2 t% P# a! H3 R
       if (!pos.containsKey(value)) {
: J* r8 _+ x1 L. Y           return 0;
" f+ m% l( ~; M8 j8 k      }
% D4 Y" A7 Y' c6 }       List<Integer> p = pos.get(value);
$ s+ a& j* b$ B       int start = bSearch2(p, left);$ v- J5 L% k9 K  d1 i! s1 K9 i
       int end = bSearch(p, right);
8 O& `" L) M7 v' m6 J       return end - start + 1;7 E$ U) j9 I% ~8 V
  }7 E; e& f8 {3 Y+ j" C

, v# b2 m3 L3 i   // 二分查找最后一个 <= value 的元素下标
' S' }/ @" F3 B! d8 X- ~   int bSearch(List<Integer> arr, int value) {, i" Z/ U6 z: B; ?; u
       if (arr.size() == 0 || value < arr.get(0)) {
4 |% u- S% m% [& Z! _* W. B           return -1;
4 `. v" `& ~& G0 Y; }+ l      }' F7 z8 o* ^. }0 U- D1 c7 X* e
       int left = 0, right = arr.size() - 1;( V3 d* I$ o, O
       while (left + 1 < right) {2 i; p5 ]; ~- u" l- x+ Q3 q2 j" h; Y
           int mid = (left + right) / 2;
( @6 R* r/ i, B# k! x, d: l* @           if (arr.get(mid) <= value) {/ Q; W5 U+ r: O
               left = mid;+ y4 z: ]2 b6 @7 y
          } else {
+ w. O1 q6 _# u               right = mid;8 f) o: y1 W" `
          }2 A# G: b; {8 n$ r$ D3 q' u" {3 z/ o
      }
9 L3 x- h* l. q% i       return arr.get(right) <= value ? right : left;
7 K% U1 _* ~$ j& x; Y  }
& r+ L4 `' x9 Y, u: P) g0 k) f; v5 c1 y' ], q7 F: U
   // 二分查找第一个 >= value 的元素下标
5 U1 o4 n; |$ u, D9 v   int bSearch2(List<Integer> arr, int value) {
2 M" D+ G5 ~6 Y- Y6 k8 X       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {
# s* a0 n1 q7 h% I           return arr.size();+ a' p7 K9 S5 n: ?2 Y6 u+ ~# c" R
      }/ p2 N( O5 F; U3 h& F' i9 I  p/ Y- Y
       int left = 0, right = arr.size() - 1;1 a4 [2 R$ o6 z$ g2 `7 K
       while (left + 1 < right) {
3 k7 a, S: b! `& j9 e. Y" H2 V           int mid = (left + right) / 2;
* {( ?: f! F8 e4 H- S" l) N. M, s           if (arr.get(mid) < value) {7 D$ Z7 _4 f- N! \# s% J( \# e
               left = mid;
  N% J0 k. }- k0 r1 A2 X4 ^( ^          } else {
% }  K. R' u- W1 }, ^6 l1 y% g               right = mid;# ^/ Q5 N" v% `/ b8 V# I- @
          }
$ p; ]5 T& j( m  ^. o      }- I, f8 h1 M0 v0 e7 M" P. n  @( G
       return arr.get(left) < value ? right : left;
2 x. ?' p( u) h: q# m- |4 r; D  }% z- W. _. h+ K: y
}
' j+ @1 A+ L$ n9 s! x# o8 G
  b- n& c- [' q1 U& |【 NO.4 k 镜像数字的和】! d3 K( w$ U! B  I+ r" |
解题思路) y: o# F( H) u. f0 [: c  ?; ]) ~
回溯法枚举即可。  B9 z6 y1 H  P2 a) q3 X+ \
5 j" C5 n$ ~/ @  k  F2 J4 C/ ^" Y7 O, |
代码展示1 B/ k& X0 D8 r+ G
( V6 g3 Q* j9 Y
class Solution {
/ r! F7 }& @; k& A   int n;
, R; C3 g  u# ~9 Q/ W   long sum;
: E  s/ P$ ~  d" @/ K8 h2 E2 W
4 L" N. [$ J; K7 M$ M  U   public long kMirror(int k, int n) {+ q: ~: y. G$ S8 f4 `
       this.sum = 0;
: k& B( p5 W( V: n/ M, s( ~5 N       this.n = n;0 ^! c: x1 H1 N3 K- ^
       for (int len = 1; this.n > 0; len++) {2 f% i  e* X6 q- e$ [+ `
           // 长度为 len 的 k 进制的镜像数字
* h5 q2 R7 T. a7 V           char[] chars = new char[len];- u6 Z5 p- @5 d! l$ s6 N- J
           dfs(chars, 0, chars.length - 1, k);, U" O, {7 h0 r0 i) U' m# ]
      }
5 {2 m- V4 t6 s       return sum;
  W2 D( z8 H- U- _# [  }2 A; [- N) z7 e% `" @
: [# I2 K' F; s
   private void dfs(char[] chars, int i, int j, int k) {
! t4 D" }7 o( ]. K, a6 w       if (this.n == 0) {
0 f1 q# A3 d5 b4 c2 u" o1 _, ?           return;! }; t* t7 ~: d/ ^; y, i3 U. {& h
      }
/ u" z* c6 L) P, ?' x       if (i == j) {
6 f. g6 A8 Q8 }" d: {# v6 W           for (int p = 0; p < k; p++) {9 n( I/ i+ T. O) f* @2 Y
               if (p == 0 && i == 0) {$ E$ I: }, U% H4 A- T
                   continue;/ F& w6 u5 f) {6 N1 ^' w' A
              }/ X& z: a" e. a" _
               chars[i] = (char) ('0' + p);
5 [9 g$ u* o1 _( ?  a               dfs(chars, i + 1, j - 1, k);
2 Z5 S  Q4 F* y" _4 C& H8 a" x' V          }
( O! V" z9 @# j) ^           return;$ D) s6 T0 ]  t  L
      }
0 N# \! i0 G& i9 J" G, @       if (i > j) {# g6 v6 o5 O- a: y* }
           long ten = Long.parseLong(String.valueOf(chars), k);0 `( }+ W' g: H9 f. g0 |
           String str = String.valueOf(ten);
, Q1 X1 N" Z6 e1 q. E           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {
9 h( o4 C+ v3 H' G) [- X- ?$ J4 s               if (str.charAt(l) != str.charAt(r)) {
: @2 J* N2 P- o. F7 D( `6 k7 f                   return;
: C& M- q. ]% M! q              }
, B! C: ^: p* c* \; t: z. `          }& `: D9 j) B9 G/ C
           this.n--;
3 h  \# R, h3 Z$ a: j7 b           sum += ten;
) E$ C/ @, C: E- ?% I) K5 A           return;
! f7 G$ X% L3 D$ Y4 p) X, |* Q' H      }
) F; X0 U9 c/ C6 l2 M       for (int p = 0; p < k && this.n > 0; p++) {
8 r# _& s" V0 F$ g, |; I( p. ^           if (i == 0 && p == 0) {0 Z- R/ l; z; S5 j3 P9 ~( i
               continue;8 |9 n9 r6 q5 H9 S0 e6 X. ~% g
          }6 M8 a7 v$ K  W: ]5 `
           chars[i] = chars[j] = (char) ('0' + p);- C5 z; o$ `! Y/ |$ |( L2 P
           dfs(chars, i + 1, j - 1, k);
6 Q- P7 J8 x6 X9 f# }# \      }7 W% \, `7 q( U* q" Y. g1 Y4 a
  }- H. }' A3 }% z
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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