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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】% o3 C; `: H' K# S/ C
解题思路- u0 R( n! ^4 D+ z1 q' y. i
签到题。1 a4 S0 _0 }+ b6 `/ {/ F+ W7 ^
$ q5 e8 F# o" C# K4 G$ b
代码展示
/ B& _. @2 y. O4 V2 D8 _+ Z
+ [) [, l) l0 F: L( Pclass Solution {0 r5 l. z/ f) c2 c6 `
   public int finalValueAfterOperations(String[] operations) {% ~0 A) o4 S( o/ H4 I/ H
       int v = 0;
9 q# ?1 w; ]8 S, }4 H4 R# r       for (String op : operations) {
8 F3 c3 p! i' N           if (op.contains("++")) {
! r2 ?. f; H8 v" ~               v++;
( e8 v6 z; y0 o) q' I$ d          } else {
. [* Z- d$ p; [               v--;% K2 d8 d) R/ v4 c
          }
$ `5 a+ e9 Q& V5 [# W! u* q, ~      }
1 C" d2 l9 @. O7 H' s/ K6 J       return v;9 o: j) Z- e3 o2 H! b
  }
3 @" Y" h6 b+ p' Z9 E2 h6 N}
& r& n! Z" x& p' B' S  r; H, s% `) z! n" A' g& m7 X
【 NO.2 数组美丽值求和】! ?5 E7 R9 P5 b3 `( v* `

( q: V5 o. P$ x  c2 T( ]0 w5 [- x解题思路
) J5 D" `! h4 `7 P由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。% `9 x4 S' E. f! ~) S2 _

& f+ F. I8 {4 G- O" o9 ?9 ~, K代码展示
5 l9 I& Q6 L* ^0 ^7 Y
' D, _7 b& H+ D, Q+ s7 x! L! n: kclass Solution {
! ?* p: v% @7 ~5 ?   public int sumOfBeauties(int[] nums) {
" v, C! h! g: ]7 t% K       int[] preMax = new int[nums.length];* ^7 \1 b- I; S& O
       preMax[0] = nums[0];* z# C/ J" n$ A3 ^" |$ o1 r
       for (int i = 1; i < nums.length; i++) {& o* i& H) X+ f! I
           preMax[i] = Math.max(preMax[i - 1], nums[i]);
  Z( Y* ?/ G1 `! N8 ?3 ?      }
$ D) n3 |+ l3 P" a# @- S: ~       int[] sufMin = new int[nums.length];* w0 _% V7 M8 Z$ h' ~
       sufMin[nums.length - 1] = nums[nums.length - 1];; s6 V; F9 Z% l- o9 c8 F- P
       for (int i = nums.length - 2; i >= 0; i--) {- K& P. g+ L) i8 P" s
           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
) G! e$ U0 b9 d5 _+ N" W1 K/ h      }, o+ J9 V; |0 A/ L
       int res = 0;
$ _2 U( I% p3 ]4 x       for (int i = 1; i < nums.length - 1; ++i) {
/ w' j3 W/ K- Y8 _5 y           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {1 X4 D& E6 c' m3 u  ]1 s0 P
               res += 2;6 P+ o+ y/ r+ ~' I' ]
          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: G  h! |3 w8 H" P! k0 ]; D7 e* P               res += 1;
6 L% W- {) R. `% `5 ]          }0 Y: I/ n3 \: W( J& w/ E. O
      }( O# v6 C/ w8 t4 [2 N" m
       return res;
( u( S& j4 U7 J( w  }
6 Z2 c5 K" l* C* i8 H}  G" `& H% A  e" j' }6 J4 H

7 X. e) F) S9 t+ R5 k; o【 NO.3 检测正方形】) L1 s! w, e/ y5 D& t  O

, n/ E/ P; r- T7 o8 r解题思路3 r& K& d- H  J" c  h- L. m
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
, D0 H, q) w0 z% B
3 ?; S) f" h; T代码展示
  ~5 F" ~# ~( ~5 ^* A( c# v" v; ?5 G: c; i2 F) k
class DetectSquares {/ _/ `" g0 F8 D+ i

+ ^' l) E. c: g" Z5 |. k   Map<Integer, Integer> count;3 N2 X0 q3 ^+ w
  Q! Z( b" X3 N1 l; Z
   public DetectSquares() {2 V2 c6 }" ~0 _$ A
       count = new HashMap<>();
7 g1 @. \* \' _, ?& J3 `2 a! V* [  }7 T  X& I- v$ M9 ?" J  v+ E$ p1 c
/ H& C! e- J$ v0 T
   public void add(int[] point) {7 B4 ]6 R) Y8 I1 e1 s$ Q$ t
       int c = comp(point[0], point[1]);- n& @5 ^$ s% J. V$ S! r7 e
       count.put(c, count.getOrDefault(c, 0) + 1);
' t0 x  K, p: n; ]  }( t9 W: Q% n: n( k4 C2 P, `

3 w% z: T! j5 s" C; W; @3 f0 u& y   public int count(int[] point) {
. q1 g! ~) ]3 G. I       int res = 0;
7 P8 n0 S1 ]" \1 ?       for (var kv : count.entrySet()) {
, p" E/ X0 ?$ e5 X4 x& G           int x = X(kv.getKey());4 V0 ?5 |* d: S- m4 O0 ^
           int y = Y(kv.getKey());8 G" ?: Q, t* O# D: g7 R' H+ P
           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {  J( c) r+ S# e
               res += kv.getValue() *
& Z2 s' d: q) M1 E                       count.getOrDefault(comp(x, point[1]), 0) *3 h4 b+ B8 ~- z# K" K$ O+ X: {
                       count.getOrDefault(comp(point[0], y), 0);  y- Q. X3 y9 `- V
          }
& T, I$ {$ J1 N; G7 }" o6 @/ ~. G9 M      }
& @, X) V9 k& F7 _       return res;
1 A* l* b8 X/ a- j" d! d6 ^4 }  }
6 g3 \% K6 j: M/ K4 ]7 x3 ?+ |/ a' `4 w: d& ^9 P7 q6 m: @+ T
   private int comp(int x, int y) {
; q9 t5 }+ F) m$ H2 w9 c% C       return x * 10000 + y;$ C) c4 `$ P0 A
  }
# Q/ P+ \* Y- w4 Y
7 s9 ^8 b" g; ^/ X9 x' j   private int X(int c) {* m: L) i5 j0 u- B' [
       return c / 10000;) I4 j* E( ]9 y# k
  }5 ]9 m, {( O9 X% y+ Y4 _
+ G* j; A* R  P7 Q8 c) U! [
   private int Y(int c) {) J; z# q; Z! ?# p/ P! t- n- l
       return c % 10000;# V! n1 n# S# t2 o1 U5 v9 J" N
  }
/ T0 I2 O" A& o; o- F}
8 k2 f6 n- x6 ]$ a9 v6 N6 h3 @4 D- }! ]" @* o
【 NO.4 重复 K 次的最长子序列】
- @$ M: |* n- j% H8 w% `) ^0 m0 E# R, f
解题思路; |# f/ Q" I" p( k0 u
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
: V2 C9 V: b8 Q) n6 O7 N# V5 z0 B4 \4 e5 P& M' \- E7 ~
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。
8 \* |. |5 J3 U
, W$ c0 D% ?% c- U代码展示
  C, C9 k' x5 F
* l/ M- R4 d% `  z( y9 g3 \; Yclass Solution {
" f5 T9 l& A. o, f7 v   public String longestSubsequenceRepeatedK(String s, int k) {
. @% Z  n* C8 A' k* @       Map<Character, Integer> count = new HashMap<>();4 @( P- F1 w! n* s
       for (char c : s.toCharArray()) {! W9 M  M0 G# T0 e/ ?8 E) |
           count.put(c, count.getOrDefault(c, 0) + 1);. h+ @, r! l2 X% W
      }4 z" x7 U6 w: }! k6 ?* A7 `' |
       StringBuilder s2 = new StringBuilder();
2 v$ ?7 `# |9 g) s& x       for (char c : s.toCharArray()) {# K$ ^- {& W+ a6 \3 l
           if (count.get(c) >= k) {
# S7 E1 Z* h& j4 _# l: d               s2.append(c);
$ {8 ~* f4 E" u' H. |          }" ?- W3 N0 v/ e. V* I
      }$ _0 h2 r  Z+ U9 h" a) t0 [
       count.clear();
7 L7 l" @/ z8 V. f3 l% y2 Q       for (char c : s2.toString().toCharArray()) {
( v7 F4 ^! F/ c5 l2 E1 `% ^           count.put(c, count.getOrDefault(c, 0) + 1);
6 f& P! {8 r1 ^; d& ^( w      }
2 X' V2 \: v7 u1 v6 [- Z       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
9 c! ~5 t1 l" D! l, h, B  }; I3 w3 c$ B4 H$ K4 ?3 M3 D
7 N2 j7 e8 |# N' B' Y/ z  E
   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {, L: \( {5 u& t9 b. h  ?, g5 Y4 J4 f
       String res = "";
2 Z0 P0 A" v* h8 b  q9 ^; n3 ^. L       var keys = new HashSet<Character>(count.keySet());
4 F; |4 u2 x& W       for (var c : keys) {0 O) f" P0 v( W( u
           cur.append(c);+ k4 l3 B0 K9 L  c, Z1 I- V
           if (comp(cur.toString(), res)) {' Y3 N% `/ z8 D! N% d+ y
               int cnt = 0, idx = 0;& o: h4 b1 c4 a* B" b5 n
               for (char cc : s) {& p  C% e+ D) n9 _) a5 [
                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {6 X/ ^) p) w) v; I3 q
                       idx = 0;' m. O* ~% d" W/ @7 G* P( [$ W
                       if (++cnt == k) {
3 `" p! i& |7 P$ |/ k                           res = cur.toString();
* Z- v( k& W7 K" @( j, b                           break;7 S/ U6 z2 n. t2 H/ a: W8 d+ D
                      }3 h: R1 |) r8 j- K& h7 N0 l2 [
                  }
9 \" Q7 X8 K( }# Q7 S( g6 _: M              }' s' T) T' R  Z. Y& r' W2 v9 c
          }
0 o4 v) {2 a. J           int bak = count.get(c);
+ ^& b9 H; X: }3 [/ [8 L           if (bak - k < k) {
4 U9 {! ?: a& h$ q4 o' j               count.remove(c);
! [& a  R& Q8 C          } else {
- w* v5 q6 Q8 u- ]" i4 d# M2 p               count.put(c, bak - k);
* j/ s1 c# s' ^0 e          }
4 q6 C! w2 |. E4 c- [9 `$ T           String r = solve(cur, count, s, k);
$ G8 l* M1 {! V! c$ J* ]           if (comp(r, res)) {
5 o* z; ]' P! V9 d/ n               res = r;
7 n4 P$ _0 X5 Y0 s          }
( h+ `7 p& W, Z4 [4 i           cur.deleteCharAt(cur.length() - 1);) `4 P8 m* V; _: A+ G  P' z
           count.put(c, bak);6 u  a' _& v4 h# K/ t
      }
4 B% p  r: ^, d3 }; r, C; C       return res;5 s4 ?# Y7 D# d. q# s. C
  }
* Q$ I  t# v/ t
8 {. G5 Y3 ^3 D; R2 p   private boolean comp(String a, String b) {
- \+ R8 H# C7 B% a       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);0 b1 I/ K  g' j$ F
  }; @9 n/ z& V4 g& a( T6 y' E. p
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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