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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】
, |  S+ C. Z; G( R解题思路: `" |7 H% C' Q% S% K% h
签到题。, D, ]0 ]2 n( L" E
1 P" G3 U1 B6 u0 V6 |, G
代码展示
$ r! B# \; n+ v, F6 j3 K7 w. h5 @! @4 k
class Solution {2 K# y9 }* R) W4 {
   public int finalValueAfterOperations(String[] operations) {: Y2 @6 d  V& r  E* C& Q1 N
       int v = 0;, N, M8 v' c  z8 A4 y# M. v) p
       for (String op : operations) {
! y+ H# V3 N1 b/ p5 {* b. K           if (op.contains("++")) {5 o6 P; J- `: @5 q% L# X
               v++;
6 |* s6 ^( X3 Q/ _          } else {
' @( t6 n( l" N6 x               v--;! o% W$ p8 }9 _; U
          }9 p# V$ L+ A- r) k
      }4 N9 {; _! v' a9 L$ C- h% Z" h
       return v;
5 h% X5 P" }1 C$ z# h6 ~  }
7 |- O8 q: S8 D}" _4 v  X. Q: A0 h8 `# e
1 r5 S3 u" A& L# \+ |3 D
【 NO.2 数组美丽值求和】
/ J3 D1 O8 |" g! P
9 j& g8 V  u1 A0 l: D! s解题思路
- ^: S' r2 j* e2 K$ ~* y" l' {由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
0 ^  A. M+ _9 S" Z5 a% W  E3 S  n6 n, b7 H, ^
代码展示
+ B1 a9 y! W8 s" r  Z) i
! t- j, x; d8 ]" _) m% eclass Solution {
* Z( c2 L4 V: h- q: I  k, \4 O   public int sumOfBeauties(int[] nums) {
: ~$ N9 E+ f0 |5 l% b       int[] preMax = new int[nums.length];1 ?. a0 u+ Z4 s& s8 k  C
       preMax[0] = nums[0];# t2 q# {) R6 S, _6 E  X
       for (int i = 1; i < nums.length; i++) {
- f5 s: e7 R' O* G& Q$ I           preMax[i] = Math.max(preMax[i - 1], nums[i]);
7 \3 R' ~; ^( e! _+ r+ j      }3 v7 S, _: I; @# k/ L
       int[] sufMin = new int[nums.length];
% z$ H' u, N/ q) Z& P6 R1 N       sufMin[nums.length - 1] = nums[nums.length - 1];/ T5 A' F/ o9 g7 i8 Q3 U0 _
       for (int i = nums.length - 2; i >= 0; i--) {- l/ k# a0 S; [: [+ Z1 C
           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);2 p4 f. I8 O+ t, {
      }
- x( d* ^/ v6 J3 T/ B6 ]9 m* Z       int res = 0;
9 C$ f7 t" t& \+ M8 ~9 l       for (int i = 1; i < nums.length - 1; ++i) {* U) {- s$ O  l  a& C9 {8 Y1 j0 z: E
           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {
9 c- \! h* F* z               res += 2;
. \4 Q! C: o5 F- Y7 ~" ?( c          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: l8 V- v! e9 o: _               res += 1;' w  `  P( ]4 k. W7 w
          }
- Y' Z4 D* Z" j) ^; U/ z      }
7 y4 C' m$ U+ i) z% t: p, G       return res;! C$ j  k: I6 \! d! O* A, a! Y1 A
  }
$ s) q. a/ r0 u}: e* ~+ a& w: M# m% y
; b6 `+ U9 V# p! {
【 NO.3 检测正方形】
7 u* U2 B- @8 [/ q/ J9 {# {1 [. H0 _* w2 |1 |! v8 h" I
解题思路( l9 Q! o$ b  B- w1 x, [$ Q+ H
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
3 A: T, \4 G6 i( y4 v4 e5 L
4 u: r. k" p( U. H% J: X代码展示+ k" V% w. Y* P7 w( \( T  a

+ T5 ?$ L! L1 U7 n) f6 r) ^class DetectSquares {9 |3 M) G0 q+ O1 b* Z( Y* z0 o

1 x# l1 Y! p5 a6 P0 J8 {1 [   Map<Integer, Integer> count;
( c6 i( W7 E/ e2 V& D+ q, q0 b& }; R! q" f1 d
   public DetectSquares() {; j1 p" C+ ]- V" l  S( U& I) z
       count = new HashMap<>();& d" u% t6 @: M3 h: H. ?( U
  }" F0 p" _- \  T- `0 I
3 J% @% r7 ^* z' y& T
   public void add(int[] point) {
) R& {6 v0 d: H/ ?! N! s       int c = comp(point[0], point[1]);1 o! n9 C! W2 R# p6 c- V; ^: }
       count.put(c, count.getOrDefault(c, 0) + 1);
- g. _8 J  P: W  }
% a7 q% ?+ W* N6 w4 B# e1 ]* N0 W0 c5 A
   public int count(int[] point) {8 [# ]9 C  ]3 q* A
       int res = 0;
/ U+ h" q6 G% B! i3 E6 l       for (var kv : count.entrySet()) {
3 L( r0 H: ^; \; n           int x = X(kv.getKey());
6 J8 v+ c9 @, E7 o9 J6 z2 n( }           int y = Y(kv.getKey());: U# X% d) h+ E6 ^( d( T
           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {/ H2 m  d( a9 h
               res += kv.getValue() *; R* q6 ^( C, N5 s% W0 `9 X- T
                       count.getOrDefault(comp(x, point[1]), 0) *0 @" @3 W& Q; v7 x. g
                       count.getOrDefault(comp(point[0], y), 0);9 \  P4 a+ O) b* G/ Q- z
          }" \5 O: `: A  |, ]/ f9 n
      }1 \4 m5 k0 Z7 u% Q0 Y7 c
       return res;
8 t" R6 q6 [2 |1 @: B; y  }/ U/ Q* H& T8 ?( Z

' A* n: k/ L# o7 ^   private int comp(int x, int y) {- m: _/ y# e8 b- ~& G7 T" y" N; C
       return x * 10000 + y;- H5 r: R6 r/ a: }: \
  }: Q% ?5 ]) b& q, J

9 `1 |* s8 \, T( R7 m9 b: Q' e   private int X(int c) {
' U& l# U+ H0 x. i! g       return c / 10000;" e- g5 a9 T6 d4 \! Q/ _' q
  }% g4 s. x6 L0 ?
, D$ C  r0 L6 o* b: g
   private int Y(int c) {
6 G3 {# m. ?% h: N       return c % 10000;
1 r5 E& C( D- |6 i0 e8 Q  }* R) H& W1 _" ?) w& n5 i7 i" B
}
$ }; \9 {; M; f
4 y8 i* ]& k9 x! p4 S【 NO.4 重复 K 次的最长子序列】8 R; T3 s9 w( z( c; }

: ~8 n" ?- ^  A) x0 A) X解题思路0 P- W- m6 q9 a) x) a3 }& |
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。1 ^- T) y/ v5 g$ B# G* `" h
6 Z3 ]: U$ E- I' a9 @( d
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。0 E) s) ~1 m3 P8 o( ~
7 O* q4 d8 S& M  q
代码展示
+ U: d' A6 g; W1 i* }6 ~7 J& V+ N9 U* g, \% U3 a
class Solution {
5 w5 b0 W4 |/ Y; u2 D- f9 R' v   public String longestSubsequenceRepeatedK(String s, int k) {
8 x3 Y9 w  y. q       Map<Character, Integer> count = new HashMap<>();& X4 O- K# U. q. M2 J. R; `' E# D
       for (char c : s.toCharArray()) {' }. S$ }4 Z, x/ w0 _, b" H' b; M
           count.put(c, count.getOrDefault(c, 0) + 1);
  X' s3 n8 A$ g7 K9 _  h      }5 S% q6 Z- [9 s3 U7 J- ^% d
       StringBuilder s2 = new StringBuilder();7 V5 Y+ u& w; j6 q7 T
       for (char c : s.toCharArray()) {& ~: B9 C. R% ^+ ~+ X& Y# y. a
           if (count.get(c) >= k) {2 n3 m" `/ H  E3 f! u  A
               s2.append(c);
$ T' |1 o& F" H! J% g/ Q4 F* K4 f" `3 L          }
8 f; M6 V7 }  O/ @$ w4 E8 M- }      }( E! q8 o( F! [' G) _+ H8 E% Z
       count.clear();) v: v& ~- A6 c# a, ^0 \3 }
       for (char c : s2.toString().toCharArray()) {* f3 e1 w9 w3 J5 @6 V
           count.put(c, count.getOrDefault(c, 0) + 1);9 n6 b! C; A; D  y- l6 K) z
      }
+ g! g3 y  V) S. d+ l! L$ F       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);6 y5 G2 r% x: n/ j3 u
  }9 r5 K0 W8 k6 i  u8 T" X* _

  {. g! _# y: A" z$ a   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
$ v  M( D+ ]0 W" V       String res = "";
; L% }& @' S: R& C$ I+ L+ H9 `+ W       var keys = new HashSet<Character>(count.keySet());) d. B/ T9 f* T: D3 N0 a1 H
       for (var c : keys) {
' Z8 D2 j& Q# J           cur.append(c);# F9 }( P" B8 S% O+ e
           if (comp(cur.toString(), res)) {
( F" r5 ^2 N( X9 c* b" v               int cnt = 0, idx = 0;
. `0 [  M% N1 ?9 T               for (char cc : s) {4 o1 R1 B( Y4 P3 b. L8 X" K$ s* C( B
                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {
) B& `+ p5 A; ?0 J; i* p8 Y                       idx = 0;6 R8 \# V3 T  H, H7 w& V
                       if (++cnt == k) {1 M1 |& z( C* ~! u0 `
                           res = cur.toString();* g' [) X  K( B
                           break;, V. U  M9 t* n
                      }# k* O/ Z+ p  [" G; F5 Z9 E
                  }
0 y1 V; m$ Z% Z9 ~7 b8 |6 T; E              }
- P1 n# [3 [2 J6 u5 I: {/ V( k          }8 f0 \: J  ~2 _5 l4 G% i0 w* \
           int bak = count.get(c);
0 e1 J: Q# o$ f+ t! c( ^           if (bak - k < k) {
6 P! ^% f6 i/ k; w/ R               count.remove(c);
& d+ U1 T/ @% z4 [4 C          } else {( Y! a! \& ~$ q$ \: v$ I  l
               count.put(c, bak - k);% K6 t6 T1 _% w3 K" [" I7 @+ u
          }
; @7 h7 d+ O5 W' b* v- |" E           String r = solve(cur, count, s, k);
7 h4 w1 H; B; U2 k# R3 B  t0 d- c' j( L           if (comp(r, res)) {- f, l, k) a# ]0 d  D- `! u. W
               res = r;5 A" h8 C1 ~- v; ~
          }
0 t7 h! E$ y) R/ e# ~! [           cur.deleteCharAt(cur.length() - 1);0 H" m* s+ G0 M( m5 M8 I/ ]: C' k
           count.put(c, bak);0 G3 v! @" x8 g5 p" C, |% L
      }
+ _# G' M4 W$ b  S- q1 @1 K2 @       return res;7 i' G& o: M! d! t+ @6 W
  }/ n; u9 `4 W; a8 Y5 X' P

1 {# O* [8 |5 h- T& Y   private boolean comp(String a, String b) {" u1 E/ L% R7 e5 n
       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);. j- n+ _6 f1 A" P$ f3 O
  }
1 g9 W. V8 r0 _; O# E}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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