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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】
$ B* w% V, A! S& v4 y7 R
! V; b2 `& l" i' r解题思路6 |; d5 K. ?3 U8 W
签到题,循环判断即可。
8 X% U3 L: N$ S  {) o
4 \8 t( _/ I4 B/ K+ L  O4 P代码展示  V: `( \) Q3 e" P) E
3 m4 V. Z2 q6 v6 w& U8 ^6 j7 G
class Solution {
# d5 I  l: Q$ I1 b/ u( N! P" H   public int maxDistance(int[] colors) {
4 d2 N6 ?) d) J5 F       for (int len = colors.length; len >= 1; len--) {
; ^7 |* n' b3 K& b/ u" D           for (int i = 0; i + len <= colors.length; i++) {: g" F% _+ _0 c/ q
               if (colors[i] != colors[i + len - 1]) {$ \) J4 T& Q5 z5 r5 C2 @! U: J: q* ]  U
                   return len - 1;
7 F8 Z( z0 W! L$ p' F' i              }9 p2 D! [9 x1 _' ^9 U/ V' r
          }# H" W' ]$ W/ [9 n+ T+ A+ A
      }5 M$ f& I2 M: m6 F: U8 j, o
       return 0;& G; L7 S- a* i2 H' S' }% i
  }+ v" Y( J) k6 q! H2 m+ n
}
" h: h; o' k$ C- ^- n* |6 J
  K0 F2 j. y8 ^% H【 NO.2 给植物浇水】
$ G$ K2 W" P& o9 ~7 b5 D  D5 y) h- U2 h* C5 X3 o
解题思路! [1 G$ m0 {! c
模拟浇水过程即可。; r) |0 H& H  s" Z

& s% O/ v% h, S8 i* o, G代码展示
0 j+ I% J/ @* p
' v* X& M7 N2 K1 l: W; T5 Vclass Solution {1 h2 [$ o( [% `
   public int wateringPlants(int[] plants, int capacity) {+ Z5 ]+ T8 D+ p, U9 c) @$ S
       int res = 0;0 _0 B* T  l5 c8 _* ^* S, c
       int water = capacity;) t. W1 ]* U  `, g, N: [5 v
       for (int i = 0; i < plants.length; i++) {' c6 U/ \( Z6 E3 z( q& G& J
           if (water < plants[i]) {
7 M2 A6 X. p' t               water = capacity;
% e( ^% W7 `3 w4 o: b( h               res += i * 2;
8 f* h4 ~" ~. p          }% V7 \. V2 ]2 e
           res++;
0 q; w/ c) u- X           water -= plants[i];
) N6 l* I: E) |: I; f% {      }
) F/ s9 T: W6 h8 m* u; D; M       return res;( F( A1 n1 S: j/ D: O; t9 j
  }' g0 f$ `! b0 W# h$ d
}
- O) ~! m& F2 M* a7 u: [/ m! U4 h) e  e, B3 [: {
【 NO.3 区间内查询数字的频率】) b4 l! D' t- c+ f1 O
) |) P; f5 h( L
解题思路
" t! D" @) S* F4 b2 F, u# t二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。- s( c) u3 h4 L# _6 ^

% s. V: _" d2 K9 y代码展示% m6 u5 ]: ~3 ]5 V
" N) n. Q1 l0 D. Y
class RangeFreqQuery {
/ \7 F/ F/ \# l9 Y   Map<Integer, List<Integer>> pos;
7 w, i6 M" x: u2 V- x9 m; k! @; x0 m9 U/ y2 {& X7 \! d
   public RangeFreqQuery(int[] arr) {8 Y- H& c7 B+ e
       pos = new HashMap<>();
: E: i4 n* y; \. k# k       for (int i = 0; i < arr.length; i++) {
- t$ Z1 `' n) G7 b- M- r           if (!pos.containsKey(arr[i])) {- b+ ^; d3 m8 {+ s5 `3 V4 g' V  a1 o
               pos.put(arr[i], new ArrayList<>());
6 k- V/ Y; i) F' z) G7 b          }5 k8 g! ]" b: K; k8 o
           pos.get(arr[i]).add(i);
& n( H+ s" T3 t# o$ V4 R      }
5 t/ B$ s$ ], D! X8 W  }
% ?- D4 O' e3 w# r- J( [) f
6 i* d& V2 E4 }+ w& M   public int query(int left, int right, int value) {: r6 A6 c' T1 ~6 d1 N4 j- w! _2 D
       if (!pos.containsKey(value)) {
" g2 `) W4 \& [4 m, V4 {           return 0;; p: N: E) A- _
      }. D% ?: g/ k( {7 c
       List<Integer> p = pos.get(value);% R  q% q$ ^( I$ o! Q4 V
       int start = bSearch2(p, left);
7 i. y, r4 t( j6 E# `" W4 i       int end = bSearch(p, right);% x: B- L, g6 I
       return end - start + 1;1 {# N9 c& o% ]- p; E# J6 Q" a+ o: f
  }
+ l3 X- t" J0 m# p/ ^2 X; B4 h
. I2 w/ v" Z8 X3 J! H   // 二分查找最后一个 <= value 的元素下标1 m  `' n4 Y- X+ K
   int bSearch(List<Integer> arr, int value) {" c9 f( X2 F9 N+ {- p1 l
       if (arr.size() == 0 || value < arr.get(0)) {
4 P+ Z8 u% q: y( O% E           return -1;
+ C* q9 d; y3 I0 ~/ _4 o$ c      }! c4 D5 K' J4 _: l. t4 K& i+ `
       int left = 0, right = arr.size() - 1;4 [7 V( u2 _+ g$ {; }: @) O- t
       while (left + 1 < right) {, M' Z$ P5 ]9 ~, X2 x! ?, a3 ]& g4 j
           int mid = (left + right) / 2;/ y- N  r  V4 N$ s1 W
           if (arr.get(mid) <= value) {
* E0 Q: S/ g+ [" c+ X) h               left = mid;
" s: ^4 c0 |& x          } else {
. p2 U9 U$ O& W) h  E5 @2 o6 t               right = mid;9 I! C( k/ |1 p( s- Z
          }/ T2 ]+ r; [! q# w- Q  G2 u2 g
      }& i  F5 ~8 w8 x8 d
       return arr.get(right) <= value ? right : left;% O/ L0 r/ P( M/ W/ ~
  }
" S# c. e+ ~8 w: }$ b( U- d1 H# a) H0 Z' E/ {6 G5 M
   // 二分查找第一个 >= value 的元素下标! P. l9 A& c  ~/ Y: e7 O+ E
   int bSearch2(List<Integer> arr, int value) {
+ g# T* W3 L9 ~' m. W       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {
) Z4 t* q3 A# p1 J           return arr.size();
9 n1 @( x- f# m+ {: \0 S$ o      }6 R! J: I( {4 J
       int left = 0, right = arr.size() - 1;3 r7 J6 ]4 J# a3 W, N/ @
       while (left + 1 < right) {
* {8 R8 ^$ \; {1 Z           int mid = (left + right) / 2;3 p2 H# T# c' H6 v+ J- \" ?
           if (arr.get(mid) < value) {
# W1 L) X, F" S9 o; W               left = mid;! k! M* Z" b8 Y6 L& L
          } else {6 T) \+ ?* [/ Q7 [( c$ b
               right = mid;
9 e9 E4 q0 O& O/ M/ }0 C          }
. ]# D. O* o7 n      }) e3 r% l! b& q6 J
       return arr.get(left) < value ? right : left;; H9 Y# E' M% b) G7 M2 v& S/ i/ ^
  }& f$ M( ^$ i% ~9 C* O, Y0 k( J
}
- I: ~1 a3 w! c9 U
) I4 A/ ?8 }5 x: {' \; Y【 NO.4 k 镜像数字的和】
1 G  h4 m2 }, I. l8 W解题思路* b1 }- V! c, R  t' a: L2 k9 |
回溯法枚举即可。+ G( j  v3 {4 n3 w
' X# b9 ]" e2 F( f
代码展示- z& [% ]% `, g  u* D8 @

) D, ?8 r# u% b8 Lclass Solution {
/ @) z+ e& R0 I; _: l   int n;+ ?+ R" e/ d& G$ f$ X
   long sum;  x7 h; Z. |( \$ V/ u% M! r: f7 K

1 w, Q1 C+ M' J! n" W4 k+ f5 I# ?   public long kMirror(int k, int n) {# }0 f. R3 K" w9 a7 U6 L
       this.sum = 0;, c; R. ^, K% w& N
       this.n = n;3 F- p4 g/ \7 A6 s# b
       for (int len = 1; this.n > 0; len++) {
4 Y& h7 C! @% c. E9 H% `* D           // 长度为 len 的 k 进制的镜像数字
  F  N  S: U! T, C6 l+ Q           char[] chars = new char[len];
6 N  ^; v  }2 P( c$ y2 `5 _* K. N           dfs(chars, 0, chars.length - 1, k);5 q5 M& B6 u) w9 y! v, P: ]. E
      }
$ I, s: `1 |0 Y. _  S5 j       return sum;
( [& n1 r- |9 b2 V- f. ^  }6 w5 j- l) U: ?: K) m# y

4 p& J% R' r* o' v( K5 \4 O; a+ |   private void dfs(char[] chars, int i, int j, int k) {2 L6 `$ N$ K( a8 z  Y
       if (this.n == 0) {
3 k; c8 B& n$ k7 r3 ]           return;
7 X6 l6 `5 k, Z, n+ A      }
8 m; |1 D3 B; H0 ~       if (i == j) {
" N7 ]* G' m( ^; B0 g           for (int p = 0; p < k; p++) {
5 ?/ h; R3 v2 f1 g               if (p == 0 && i == 0) {& g* J4 j9 N4 ]7 b
                   continue;
" `0 D- ~8 p. |4 w* w$ a              }- C) C5 y- u0 @4 l1 Y
               chars[i] = (char) ('0' + p);
' Z0 u/ i+ K; V: D9 Z- f               dfs(chars, i + 1, j - 1, k);" I" o8 s4 ]# k& f5 y8 Q7 {
          }
$ D4 T1 [6 T# A+ b" R           return;) ]7 h( E# \0 i' Q) Y+ Z0 t1 ~
      }
% c3 D6 }+ y3 Z2 G3 y) @( S       if (i > j) {7 p& N" F: w9 ]  k
           long ten = Long.parseLong(String.valueOf(chars), k);& l) k/ r+ z: c; K
           String str = String.valueOf(ten);
0 H' u6 O9 [) k1 R2 y! n           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {
3 D" [/ K, ]8 |! v               if (str.charAt(l) != str.charAt(r)) {
# D* m; H1 s. X* x* d+ X8 i                   return;
6 ?7 y* j0 k4 U7 t2 J, d              }) S+ W& W1 v/ K
          }
$ c8 f  L/ }8 p* M7 o           this.n--;
8 V* M9 v# [+ i2 \) W           sum += ten;/ X) N. {- v4 B- F7 J$ l
           return;( m: P1 x  {" s7 Z$ {8 _  L
      }& W9 K; B& c( Z% l
       for (int p = 0; p < k && this.n > 0; p++) {7 A! u9 D, |; C6 Y$ j) h
           if (i == 0 && p == 0) {
% c& c& L  }. j0 ?* W               continue;
* d+ U$ h8 G' N  v) d0 m4 f* a          }
- P! O, T; S- f  N+ L( F' Q9 @           chars[i] = chars[j] = (char) ('0' + p);
$ c6 \  z2 T3 @           dfs(chars, i + 1, j - 1, k);
3 L4 y3 K  L. b8 t  ~/ b      }3 h) v) A8 j' y7 P  r* |9 [; h& j
  }
3 A" k- S$ Z$ m1 Q2 d; [( ^) W/ }}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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