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

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

上岸算法 回复:0 | 查看:2422 | 发表于 2021-9-21 23:03:20 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】% h$ u- A+ [# y  U/ `
解题思路4 g' h; B- y& m' j& c
签到题。
+ F" ^6 s  v+ W$ y; {1 A5 X9 d7 }. T; j9 ]
代码展示  }/ Z. P' N: [7 @! d
1 [! K2 ~$ f: Q# Z2 N5 C
class Solution {2 }0 t) N+ ]3 q) R0 r' b- x
   public int finalValueAfterOperations(String[] operations) {: y! G8 A/ V. g8 L* ]2 g
       int v = 0;- |) r. o3 t4 V- w6 ]
       for (String op : operations) {
3 E8 H, c# g! E/ ^% m2 D           if (op.contains("++")) {2 R/ G8 Q3 c& I; u& q; A, @. @4 I7 ~
               v++;
# G$ f# D+ ^/ L' K  @          } else {
4 [. k/ }. O% x) w+ h               v--;
" _' D- ]. O8 s# O* d( H+ J          }& x# t, t- P+ g; F% I/ r' P  v
      }2 t7 {9 ^( x0 a8 S2 M
       return v;
3 b: Q% C" q# y7 E1 x  }- Q, G1 ?) z& P0 l% B5 ~/ A
}
  }+ q% `6 m$ d$ m+ Y, s4 @" R5 q  s4 K; n, j) u+ R2 R4 C: Q: R
【 NO.2 数组美丽值求和】- g8 _' J- P& `, U' G3 G' d& h
  c$ U. R' Q1 ]8 Z$ G3 }
解题思路# Z7 g) J  g& p3 h. f( ^8 P
由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
7 M. G) Q4 J" I0 x! J; z; a# s) O( g3 \7 X5 [& Z7 W% h9 X/ u
代码展示
+ W% x" `9 K7 v7 p3 @" t: X, Q$ P& a, d! T2 C
class Solution {
$ D0 I1 H4 M# V! r; S7 @   public int sumOfBeauties(int[] nums) {; H' p* ?; N4 `$ i
       int[] preMax = new int[nums.length];
5 T/ j) R' |: d* W( n       preMax[0] = nums[0];- R5 u* [( h/ G3 _5 A
       for (int i = 1; i < nums.length; i++) {2 C6 P/ d" J" n8 J7 h! T
           preMax[i] = Math.max(preMax[i - 1], nums[i]);
2 g1 `* J8 Z4 ?; d      }
& {  X- X: x9 }       int[] sufMin = new int[nums.length];
( Z& b' b! `& A( }/ B+ K       sufMin[nums.length - 1] = nums[nums.length - 1];
! c& s4 A( I5 y$ R/ I2 u- |) H8 n       for (int i = nums.length - 2; i >= 0; i--) {# i5 E$ g: g. {
           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);6 I2 a9 {5 |0 r) ]8 k9 |- T$ v2 ?
      }9 L: z0 z+ P  v7 j" R. e5 k# E& Y7 r
       int res = 0;
6 S5 E4 N$ X! O0 k       for (int i = 1; i < nums.length - 1; ++i) {; c& J& v" l, p# m- h+ b2 N
           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {
/ i. o5 I. f7 B" k               res += 2;
1 ^5 ]& J. |% o; K5 Q          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {8 L5 l2 d" F& v( ~* v
               res += 1;
. ?9 t' c0 Y' f4 J; e          }
/ w4 g0 x# z5 |+ Q6 q  r      }
1 ?1 [" |+ m8 U" ]" L) O       return res;- F+ z/ a5 s* F
  }9 b4 p) ?" G2 w8 G( [. U
}
& o' r% v! y" |9 M$ n/ c% g% |  s0 M; e: ?
【 NO.3 检测正方形】; t6 z0 e9 I2 R
6 d) A/ E( Y, L9 E7 ]
解题思路. N' ]0 `' I0 C. m
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。" _1 }  i7 `5 `. C- d1 x
# ^/ G* N5 P: O3 ]% ]3 Q2 u. c
代码展示2 i: h; T; j$ m: D( @8 h
8 X4 ~% k# e+ c+ T3 D- {  [
class DetectSquares {
, J0 P  h+ H7 m1 w
* [$ j8 v1 J: Q9 L3 V# O, t   Map<Integer, Integer> count;4 g. M. Z+ q. j# K; V7 w

( h/ x2 v3 a! i3 T& ]* I, C   public DetectSquares() {/ m2 z8 {9 u; n9 C: U# x
       count = new HashMap<>();
. x& v" d8 J3 i4 e  }8 L; R, E0 `& F9 v% M

$ m( a: m( j5 s0 f( H8 {% c" G# O   public void add(int[] point) {
) s3 z8 @2 F% q8 H' t       int c = comp(point[0], point[1]);/ b+ J5 M: H, x1 k0 p7 L) @
       count.put(c, count.getOrDefault(c, 0) + 1);
2 N% u) u2 v) O0 Z: I2 O  }  m8 D2 K0 r& r/ X8 O
! D2 y5 M! i; E# v8 R( B
   public int count(int[] point) {
' ^. w8 W, i3 t- T/ j# O. }: P, G       int res = 0;) a6 P* A0 e4 K
       for (var kv : count.entrySet()) {
. r* C9 g# W, e8 b           int x = X(kv.getKey());( z# m  x. X3 l& ^: W0 K$ n  P
           int y = Y(kv.getKey());9 y) j1 _" _4 w* j' O% J7 d2 M2 N
           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {- O# z* u) l% M) n  R; I8 k& X; `
               res += kv.getValue() *
" v( ^$ D, b2 ^                       count.getOrDefault(comp(x, point[1]), 0) *6 m8 V4 y. p9 j2 @  o
                       count.getOrDefault(comp(point[0], y), 0);( q/ j' K$ n3 g' C: b
          }
; P3 ?( a& w! b+ q: s0 V) T      }
% c$ z0 u" d, \2 O0 K& Y       return res;6 h5 |) A2 P5 f9 q  ?
  }( _0 ]9 E" t- w/ J5 G+ A, \) X; l. z

6 _& F7 E& g: u& D; B% L/ @   private int comp(int x, int y) {
) \6 y3 ^# O. A. ~       return x * 10000 + y;
  o- b9 j+ M& }( a" A* E  }6 @0 M5 @. h6 Q5 W2 O* O
1 b" {* |3 L' V3 I7 W
   private int X(int c) {
# K' n# e0 `2 [# ]       return c / 10000;
) P$ j6 T' [* Y% {  }
' e7 R' R) H' `: N2 D5 T0 ^
; V  [8 b3 k* c( p: x   private int Y(int c) {3 f1 M' B( q5 g
       return c % 10000;- L* V# A# p) N4 u! K. |
  }# E% {* u. I+ W5 t6 Q
}1 O; J5 o3 g) h% e+ ?0 V+ Y
& L! @4 N6 O8 O- Z9 u" \( n
【 NO.4 重复 K 次的最长子序列】! ^, O  P# E7 f: l$ H- A

' @0 o1 h% Z' x- c4 C解题思路
7 B9 F0 `2 J0 z9 \8 n& M( e注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。( ?$ {: `1 T! e0 G% d1 C8 p

+ o: c) M. d# [我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。: g! U/ _) s/ @, M* X- A
9 x4 P3 \$ z/ c- d) o
代码展示
4 f1 }8 t" G7 U8 t( D( J8 J$ g( S# v; n- r7 M. G1 X
class Solution {
& @2 a; P% W& I! R: p   public String longestSubsequenceRepeatedK(String s, int k) {
: g- C+ F: [( C5 X       Map<Character, Integer> count = new HashMap<>();
# H, V' v- y. E, i% Z# l0 y# F, r       for (char c : s.toCharArray()) {
! E3 k7 y1 a  j6 ^2 X           count.put(c, count.getOrDefault(c, 0) + 1);, F+ q/ w- y3 `0 X. w0 H
      }
0 O& T1 ~- H1 u       StringBuilder s2 = new StringBuilder();
" d; ^3 U2 U$ l0 [       for (char c : s.toCharArray()) {
( X6 r/ X$ k( P           if (count.get(c) >= k) {
! f8 w1 ^) F( l  O               s2.append(c);
* }' `+ r& e, d. W          }
3 c- l% {1 k' q7 u4 s" j" X. t      }( W' Q4 `( I9 L9 i: ^3 A+ n
       count.clear();: W8 Y* `; r1 U4 v. o
       for (char c : s2.toString().toCharArray()) {! Y4 U9 E2 m  {  v# b# r
           count.put(c, count.getOrDefault(c, 0) + 1);6 {; r4 ^; B& J0 K
      }4 U: q9 M; k8 Q7 X
       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);6 R7 r& G/ V" r/ c
  }/ M; }* Y7 m8 t) J' `0 z0 ?4 y% O7 O8 W3 c
: v8 y0 i6 l( ]) y7 G
   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
2 D8 a1 G( ^- u. J# W, @       String res = "";+ z6 W+ I/ H! l: l
       var keys = new HashSet<Character>(count.keySet());
" N. G5 G8 e" c2 Y5 {       for (var c : keys) {; f4 m; k& A. A$ _1 R" K7 {
           cur.append(c);9 }7 e/ o' I/ l% H! ?
           if (comp(cur.toString(), res)) {% @& A5 c( \( k. W* z
               int cnt = 0, idx = 0;
  k* _+ L+ W4 H7 y               for (char cc : s) {8 a. ]2 {% p/ E  H* C
                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {
6 O+ k& x/ ~5 f0 k- n                       idx = 0;1 ~& V3 d  u. ^% P: L/ Y
                       if (++cnt == k) {
8 R6 `5 a" H4 _' E                           res = cur.toString();
% Q8 k- x7 G7 c$ J                           break;- z) r: W! i( `) A
                      }( \2 |& E1 g4 p1 @6 q" h( u7 B* y
                  }1 a8 |5 p5 K4 h7 N3 P
              }
1 E5 Q# N8 Z  e1 x6 [, ~% x          }
. e) [" _* R" ^9 ?6 q4 p# A4 Y" P           int bak = count.get(c);) d" h" j3 x1 O, v- z! b
           if (bak - k < k) {
+ D8 A7 u5 S- v               count.remove(c);8 Z9 r# Q, P# L7 s# _9 P
          } else {
- O3 j6 v1 M$ ?7 A: D               count.put(c, bak - k);
6 Q2 V9 ~* F5 K1 ]" `6 {          }
7 V3 [! }& I! y           String r = solve(cur, count, s, k);
- k& X5 |" S. b" ~           if (comp(r, res)) {4 T! v% E: u" N2 J, W$ U
               res = r;. i3 J) j5 S; `6 G5 M7 [
          }
% a$ z/ b  O) h           cur.deleteCharAt(cur.length() - 1);
1 w. Q, Y* B  C4 e6 [% H) S. v4 [           count.put(c, bak);9 `6 |* A9 n1 ~, Y. U
      }
0 h& b; i2 M$ X2 `       return res;: D/ H2 D( `( Q4 d% \0 H  Z
  }
4 W* o% \7 f$ r1 K
9 Q2 }5 a) F$ A& o4 o' T   private boolean comp(String a, String b) {
7 N8 p2 \4 N( T. Z; [       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);1 P) I! l2 O& v5 P$ Q" G  I
  }/ b5 _4 X. \1 K, i( `( V1 K: D: K9 u
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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