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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 两栋颜色不同且距离最远的房子】+ |; A2 L; e5 i3 E
2 P: ?, G/ [$ ]5 P
解题思路2 T; ?4 ~) ?8 D1 u* h( A7 ~$ M9 o
签到题,循环判断即可。
9 z5 P9 r  P- w& d- z
1 p6 w# c3 i6 [: O代码展示* L. Z- N* W3 l$ C  u
/ F4 B$ A, J: K: d( q0 J
class Solution {
( u! T% i3 d) I+ C2 @   public int maxDistance(int[] colors) {
2 U" @$ Q4 J: U: o* y       for (int len = colors.length; len >= 1; len--) {
% W: X  C% J# t, K2 N           for (int i = 0; i + len <= colors.length; i++) {
) j3 Q/ L  ]( ?+ v2 q6 s# d0 p! t               if (colors[i] != colors[i + len - 1]) {1 Q8 B- K1 W7 e$ |0 f
                   return len - 1;7 w2 r( ]' m' _% T
              }, ?, l& d2 g# h" x4 D' u
          }9 D0 S% V- [2 l1 A3 s
      }# O3 ?7 _5 W7 `. m
       return 0;
$ @6 u2 j( Q+ N/ s0 c( c7 I# U, p- r  }6 b: ^3 s; W, P7 R, s0 ~
}2 W- X; T8 \9 ?2 l' C
0 u- |2 W1 G/ L4 M) K. r- i: r
【 NO.2 给植物浇水】
8 a- T! w" Y$ \$ L# Z/ Z$ o0 U; W
9 E8 [$ H& C) E" ]6 w5 {解题思路8 u: O5 c7 k4 n4 K% v
模拟浇水过程即可。
$ F. O& G3 _8 f  C) x6 j# x* C- Q5 r$ t
代码展示
- D- e5 s* p; K, }( D2 G3 N6 i" {8 r; |1 ^) |# o
class Solution {) b4 `$ f) c% x8 _# F* Z
   public int wateringPlants(int[] plants, int capacity) {4 [* i3 Z/ U6 U1 F  P) d) j1 O+ h
       int res = 0;2 J% ^) P* [7 |+ G. w! J8 X! a# O
       int water = capacity;' A( l- z5 ]2 _. c5 {
       for (int i = 0; i < plants.length; i++) {
; R6 c* x7 P2 r4 t5 T. L           if (water < plants[i]) {
' ~: y- ]) c( u6 t4 f               water = capacity;) ]; Z. T. L- X0 ~
               res += i * 2;
+ Y, n9 _. Y; }3 k          }- Z+ z- g0 Q# Y$ h* e% G
           res++;
2 J  `3 i. J' f& X           water -= plants[i];6 q& q0 t! Z# o
      }& R, |- t% U6 x( X& @, f8 P
       return res;- ?0 r- n3 g) x* ^# [+ g9 y2 S
  }( {# w) G8 @: z5 }7 a4 ]9 c( o
}
! j$ X1 E1 x* _0 ?9 X$ T5 S/ b5 ^" H2 h2 K2 }% r# p3 C5 {5 D
【 NO.3 区间内查询数字的频率】, t$ W( f$ k+ F( ]

" A5 m" N' o$ l! [/ F解题思路
8 L- i" E  Y7 G4 F7 d* C二分查找。统计出每个数字的所有出现位置,然后在位置列表上进行二分查找即可得到该列表中位于 [left, right] 范围的元素有多少个。
5 `  A- Y: u' R& c2 M: i% R( w8 U# l* W% J- o9 y9 P
代码展示
) P% {- m' z) ]% l' p' ~
5 [% s, t: d3 Y) z) |4 Aclass RangeFreqQuery {4 C- b. i* O* S& C0 e- l
   Map<Integer, List<Integer>> pos;: O$ Z7 R% a- K
" P8 n1 @+ A: d
   public RangeFreqQuery(int[] arr) {
) S. J9 \2 O0 g+ ^/ t       pos = new HashMap<>();
8 t! x2 @9 I8 m       for (int i = 0; i < arr.length; i++) {
4 J. o5 L( N" V( h           if (!pos.containsKey(arr[i])) {
  t0 v7 R- U" ?) ^0 \, D4 X               pos.put(arr[i], new ArrayList<>());
. w/ N% e9 j  v: G5 c4 I: f  C1 v; [          }6 [% f. h: Y: `8 z' ~$ U4 G
           pos.get(arr[i]).add(i);
" f2 b+ w8 r4 i5 E$ q: h% d+ @      }) B) [& [: j- m& C" X0 ^  q
  }$ V- n$ Y9 Z7 D8 W" [! I

: H" m. o. t2 C# B   public int query(int left, int right, int value) {
9 s; ~& z! W, A1 o- K       if (!pos.containsKey(value)) {% J: S9 D7 b, Y( D1 w
           return 0;
# x/ b) J2 }8 n* Z0 j7 E  ?$ u/ A* b      }
7 J7 @5 \% n0 d- {       List<Integer> p = pos.get(value);
! T# x: L# c6 r0 ?       int start = bSearch2(p, left);: j9 G1 b7 I% _
       int end = bSearch(p, right);* J1 f0 ]. l, ^' p+ B# K0 O
       return end - start + 1;/ R# V5 x+ i! T5 \3 Q
  }
/ F+ o5 s" E5 b0 y/ r1 R9 j7 t- n1 m
4 k: T! S4 ]6 ^9 h3 n2 M   // 二分查找最后一个 <= value 的元素下标1 u& R) c/ U5 H2 v
   int bSearch(List<Integer> arr, int value) {: a: `1 `" ^" @
       if (arr.size() == 0 || value < arr.get(0)) {/ v* D# A% J7 H& E4 x  L
           return -1;
6 P! b: R" F& z6 C  r      }% i4 ^, m* s" o6 @) \  _
       int left = 0, right = arr.size() - 1;
8 A; ]6 f# P' c) L+ j       while (left + 1 < right) {
( K8 j4 y( t; O  @# v7 c           int mid = (left + right) / 2;5 h* Z" N7 w" u( s3 L/ ^3 g
           if (arr.get(mid) <= value) {, B; |5 @* W/ j8 ^) k# J& `
               left = mid;* s* t0 ~% d' u" `1 Y! c
          } else {' C# T9 O% t4 ]$ x- f
               right = mid;6 F' l; o5 ]6 P; j
          }
& D; h# m9 F) {! ?* V3 R4 W      }& v) h7 H( ^! n6 H8 ?% b& J
       return arr.get(right) <= value ? right : left;' _6 V0 T6 j- p, Y
  }
) P' m6 i% {( J. h& e" t/ p* A- o/ W0 J
   // 二分查找第一个 >= value 的元素下标
: h7 ^8 t; G+ j6 i5 t- K   int bSearch2(List<Integer> arr, int value) {. C7 ~7 b/ s; W4 M- m* B
       if (arr.size() == 0 || arr.get(arr.size() - 1) < value) {
+ P6 Y' k0 x+ g! @3 h           return arr.size();. ?1 r  N  U1 |- @+ [. {4 w
      }2 h1 Q* s) j5 l+ m# J' d6 C' ~
       int left = 0, right = arr.size() - 1;1 I6 @  i( Y: \
       while (left + 1 < right) {9 h3 q6 [2 V5 l- U/ r
           int mid = (left + right) / 2;
5 P  U7 a# Q5 p1 _           if (arr.get(mid) < value) {& a, T, t* Y% M2 w
               left = mid;
' s" p* k1 u7 Y          } else {
2 o  I! L5 [6 i+ h3 ^/ U2 ^0 S               right = mid;
0 j+ r8 C  O- Y, L          }
: F. ~' e! L. w! h      }
9 x5 y9 B$ u* H2 H- L' n       return arr.get(left) < value ? right : left;
( o, U3 u5 |' W3 S$ g3 w3 K/ ~  }
! b8 V* X8 f7 I9 v, {}
5 u- V* b% P6 E; q3 A* G  a: G  @
. p6 _% {( L: L% a【 NO.4 k 镜像数字的和】! Y1 Z' a) i/ O
解题思路
8 o5 e5 j3 _+ D/ R; B, S$ }3 e回溯法枚举即可。8 o5 Z  ?2 |( Y1 F7 f1 s1 R

. |- }. o9 i; O1 B# Z+ C& o) {2 N代码展示
0 o2 d: @' l* Z3 n: A" n
  `- O' ^: C" h  @8 D/ g/ J% ?class Solution {
' \; M! W8 h6 w9 Q; n: v$ {: f+ f8 _) C# w   int n;
4 E2 V2 K4 G$ h   long sum;* L+ F/ L0 ]- h% n) z: ~0 D7 W
5 k6 H- D4 M- X3 A
   public long kMirror(int k, int n) {3 O# W4 @# C1 S3 o4 z/ I6 R9 H
       this.sum = 0;
6 Z9 \0 o7 R. c) ?1 v% p       this.n = n;; O9 ?( @1 p7 E
       for (int len = 1; this.n > 0; len++) {& B9 t; T8 w3 ]4 i$ i& O; Y
           // 长度为 len 的 k 进制的镜像数字
  |! b" \4 J* Y) P. d1 N           char[] chars = new char[len];
: Y* M5 ~) }6 z( D4 N           dfs(chars, 0, chars.length - 1, k);
1 {2 c# D' g3 e( U      }
. O0 X7 ?7 @( ?2 C3 r4 S       return sum;" |! Z; e' U: _$ @' T" Q/ \
  }4 g( k8 x  F' K+ N# P$ ^
) o- H. A4 K  o& a( b) }
   private void dfs(char[] chars, int i, int j, int k) {& a2 I) D/ @9 c
       if (this.n == 0) {$ [$ N9 a/ ~0 M. F! R4 Q
           return;
  a% e7 \. a' @! x3 G5 z      }% f) f% j( p0 t
       if (i == j) {
# Z2 V) A) h1 f" ?' |           for (int p = 0; p < k; p++) {8 `0 _+ U& J, L5 l% E; O
               if (p == 0 && i == 0) {
5 R4 {, E8 @4 U/ ^- c3 m                   continue;
) r( V6 t' I# K              }
: U0 A- N8 F6 b0 a, v" g7 m2 l               chars[i] = (char) ('0' + p);5 m( y& k/ a; R. E- @
               dfs(chars, i + 1, j - 1, k);
- @+ d" ^! @7 E! M          }
1 X' P9 {  e: H% @& r. F( v           return;
6 M* |) r' i$ e. u% h  ~2 Z      }
- ?' S$ p& i' R# K5 @+ k       if (i > j) {: e9 z. O5 v7 t* Z5 s6 @7 i$ u
           long ten = Long.parseLong(String.valueOf(chars), k);
( h# c2 g" p  Y1 W* `           String str = String.valueOf(ten);+ p2 D! n6 f( z3 \' K+ J
           for (int l = 0, r = str.length() - 1; l < r; l++, r--) {
; y6 Z1 [+ p, c6 E3 j+ H  S( u% |+ K               if (str.charAt(l) != str.charAt(r)) {
( b* i, O' O" R& B% A7 k- c                   return;
3 V& `; E5 _2 ~1 a% m5 _9 o; m              }# C/ \7 G3 l$ y& o* ~3 I
          }" a2 V6 D# X( d$ G; K# i
           this.n--;8 X7 V, Y" J' F- g% q
           sum += ten;  K: ~; c) G6 K- b( r$ _
           return;
5 W9 d" @! m9 L/ J. m( Q) N3 x      }/ |  D# w% F; U; E! c; K% t
       for (int p = 0; p < k && this.n > 0; p++) {5 ?: T' j. w1 M3 k8 q; L! L
           if (i == 0 && p == 0) {
; h) j1 s8 y8 K               continue;& Z! }5 _' f1 e. d
          }
8 B5 Q0 M1 H  n0 j7 m           chars[i] = chars[j] = (char) ('0' + p);
& C! k/ E- o  J4 Y( E           dfs(chars, i + 1, j - 1, k);5 O; f% ^- B: S* S" {4 B
      }# K$ j7 o( ]7 [
  }7 O; |- a3 d9 ?& t
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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