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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】3 ?5 Q) ?8 Z  U( n  D
解题思路
) `- C% h. Z! Z) F5 F签到题。
. Q7 Z: p2 F: I- a( C) }: Z; E% }. p8 l5 s$ o
代码展示
- A; v6 e$ \& Q. U  h5 H
) M& p4 p+ r) |6 A, Dclass Solution {
  P# e  @- g  Q+ k- }* g% [) t   public int finalValueAfterOperations(String[] operations) {
: S4 z" E. G8 ~3 o0 d       int v = 0;  R% O# l5 I$ F# t% x
       for (String op : operations) {6 T" d* K! i$ c
           if (op.contains("++")) {
& q, H! Z5 u' s5 G; g! @2 o               v++;
. K! J! q& Z+ h  v& J          } else {; S) N. s% @& n% S( p; K
               v--;. l* ?; |! Z; B' |6 ^) D
          }+ Q( P9 M. m/ h$ s, E- G4 w" ^
      }
4 U0 [* J- s( v. W* O       return v;
. [5 [7 `$ M- h4 G& ]  }
9 Q- |2 v7 c4 y8 q}2 j  s& Y) x) C2 z

5 j) @' ~+ o1 \6 Z【 NO.2 数组美丽值求和】, s! [5 B" Z% v7 T. Y. B/ D4 }/ L

# A& e3 M4 L4 [- @/ W6 f2 K7 s解题思路
9 S& _" W9 l7 C8 R& R/ L由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。* ?3 f" T4 H# D" t8 J. E2 V

( r" b- z( m4 w9 p& C+ ?2 k代码展示
) V5 u; V8 @0 b! K* I. T
- a  T$ n- }( L0 D2 dclass Solution {
% g3 k! X* n) o" O) p9 A+ }   public int sumOfBeauties(int[] nums) {
1 y/ ^/ P+ }" }  y       int[] preMax = new int[nums.length];
9 x' T# `# y8 H       preMax[0] = nums[0];5 T' O" N% S( b  E5 w
       for (int i = 1; i < nums.length; i++) {* u/ l$ k7 S- d6 [  k) t/ R5 [+ {  e  [
           preMax[i] = Math.max(preMax[i - 1], nums[i]);3 i/ ~  f4 _7 A
      }* r7 W7 [# s7 \1 A
       int[] sufMin = new int[nums.length];7 T: I, _- D; X; m. [; m9 e5 I
       sufMin[nums.length - 1] = nums[nums.length - 1];$ H, o* d  u8 a+ y
       for (int i = nums.length - 2; i >= 0; i--) {
) C1 E) w/ a! C3 [           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
" C. Z7 i9 I: l# i      }6 @$ N# ~' t' w! P: }
       int res = 0;
6 l# [: b' o$ U# H       for (int i = 1; i < nums.length - 1; ++i) {
" T/ z; R+ e) _0 o           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {: g% `5 M3 t' k# H: W
               res += 2;
2 R" D& r' h- `$ O+ m2 `* f1 K$ g7 }8 m' K          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {/ F0 t- L& w4 K( z3 k& h% B* X3 n( U
               res += 1;
& @! r7 U2 I  @# L% G, n  W& ]          }5 O5 X# e/ N3 V& T( O  l
      }" u2 S; P7 P) o" E8 x! a
       return res;. F2 Y( U+ W6 k! G: @7 L
  }! X6 h  t, x  P! g4 k
}
( t! V0 ~1 A! ~; f8 l5 P- T) X$ a' E/ N0 Q- h
【 NO.3 检测正方形】5 j7 ^% f; I0 F- X' ]) M% |
' J4 u) X0 E4 s) R' j# G
解题思路, C* U+ d9 \8 ]' x( H3 V
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
+ `5 |7 L/ S9 {
! |4 ]% p  Q$ c代码展示9 n+ R6 e! o; b' u0 M, _  o4 T
( T* t+ F% L4 o( D- d: x/ \% B
class DetectSquares {# K. T9 c* t8 V. Y
& P" ]) x" \7 w
   Map<Integer, Integer> count;
8 j+ I, x& F2 O" l* x8 W" u
; V5 `9 W6 b* ^" X$ `! ~  o* n   public DetectSquares() {
! P5 z% a* E& h( ~6 J       count = new HashMap<>();
1 x; Y1 {6 ]& t- U3 ^  }
6 Q# y! s7 t- `
/ t; g! i# e9 p* l! y   public void add(int[] point) {& p* \3 f: e7 I1 J
       int c = comp(point[0], point[1]);8 b; P/ u- `: u5 l% V, F7 B5 y2 I
       count.put(c, count.getOrDefault(c, 0) + 1);
* c4 r1 Q' e0 w& ^, g  }$ ^4 ~1 D. }2 H6 x$ U
# B; o& D- T2 x/ V
   public int count(int[] point) {
  `9 f) S# Q4 r+ D% k       int res = 0;. ~( s; M$ T# v1 o
       for (var kv : count.entrySet()) {
% J& s9 T' K- C& w% H$ n- g           int x = X(kv.getKey());
3 z8 h( F% x6 t           int y = Y(kv.getKey());
  H) r& w3 H" x0 X% x  a: d           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {8 T& g( I& l$ ]
               res += kv.getValue() *
. {8 m* @' x% g6 _& z* I                       count.getOrDefault(comp(x, point[1]), 0) *
, [% r# q0 Q+ m0 r8 A                       count.getOrDefault(comp(point[0], y), 0);+ [0 l. _" a% S3 C1 b
          }
! d4 A' X  y, ^+ T      }
0 V# p* ?' F' T2 |/ U       return res;
; J# L& _  g4 m) q6 `  }9 R/ v& k7 X: l6 z) [

# l3 ]  A# G9 K3 M6 L3 b$ N" E   private int comp(int x, int y) {
( u9 N7 _- R& U       return x * 10000 + y;, E; z5 f( g8 H
  }
* P# s. Y  j% ?0 t' U6 w. C6 ]1 M) A  f7 ~
   private int X(int c) {
4 W6 J" Q8 k7 s/ z: @- o! B       return c / 10000;" _' Q% z1 f$ p( r1 v6 U9 D4 Z
  }' c+ ]; R& E" ?4 m! ~+ [+ x
6 `* m3 \- @2 g5 m$ C4 l2 R
   private int Y(int c) {5 k0 ?/ Y6 A9 p# I
       return c % 10000;
0 @  ^  O, I7 ]0 @; t9 @+ d  }
, N; |, p& x% W/ }3 W}
8 \: Q% X; T# G% ?: U% S0 x% `, G( B4 x* }# C
【 NO.4 重复 K 次的最长子序列】
3 }" c1 |4 M/ o) B1 ]: N4 b% |+ }( u& W: k" M5 B
解题思路+ M' N  @- {4 ~5 O. _( g0 J+ R/ x
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
" [$ `' W3 X+ ^. E1 g
/ Z! D; `1 y* }) o我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。5 i; F; B1 Z% C4 o9 X& P7 x

  h4 H3 M* \* _代码展示1 `2 X+ y* r1 m
7 ]% m( x! @$ }( @) f! A& f
class Solution {
' \. `! }9 T2 y5 U& N8 O0 R   public String longestSubsequenceRepeatedK(String s, int k) {) A2 x5 u2 M; K; U
       Map<Character, Integer> count = new HashMap<>();
. R) G- d2 ^) E/ L% E1 N7 H       for (char c : s.toCharArray()) {
0 @) }+ B; d! L; b2 S           count.put(c, count.getOrDefault(c, 0) + 1);
. W6 P- T9 ?/ W2 U3 z* i      }: ~5 E6 A0 J1 c% Z/ {
       StringBuilder s2 = new StringBuilder();
* I& A1 E7 l5 |       for (char c : s.toCharArray()) {
9 Z5 I( I) J+ t( Q. h           if (count.get(c) >= k) {! j8 I7 b: E6 T1 W# B& X, U6 X
               s2.append(c);
: z  M, l8 @0 Y          }' I  t1 W2 p- x5 z3 D3 t# C
      }+ R* D, \* j2 @! [1 _' h, q
       count.clear();8 |3 o$ B% c, }, e" L
       for (char c : s2.toString().toCharArray()) {
' J8 y( P  O6 w( g: ?5 n2 K+ G           count.put(c, count.getOrDefault(c, 0) + 1);
5 u4 B. _& R. Q0 b8 S" G+ X% s( z6 M( A2 t      }
: C( e7 ~: q6 ?. j& N, }       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
. Z$ h, L' h" r- O. b9 {  }. {" g* c* z4 w4 x& |
+ ^: ~, Q2 a  s6 j, G
   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {- w8 p0 K3 g7 T; Y& j
       String res = "";
; F0 k( L2 C. _       var keys = new HashSet<Character>(count.keySet());: H% D/ W" a' D4 ]3 A8 u
       for (var c : keys) {
8 j; K$ N: ~' d5 h% [           cur.append(c);) X$ q% `. H$ f. w9 A
           if (comp(cur.toString(), res)) {7 I+ C7 M8 D, v+ H' Q" ?5 N
               int cnt = 0, idx = 0;  g7 v, o  g# T1 C" b2 R' F5 A
               for (char cc : s) {. q; J. _8 v% R3 U: S. F
                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {
0 H7 }( l0 M/ B! R, A                       idx = 0;
/ C1 L9 {3 Z5 s* O. y                       if (++cnt == k) {* n* e) h1 O, m% n% E# O
                           res = cur.toString();
: \9 u8 l6 J- X- U2 G                           break;
' D& V" u/ M& @4 s" b5 H+ p                      }
5 N5 C0 ]* ~( e# F                  }* Q/ n$ c# C- H
              }
, N; ^2 [- u: ^( F. R- }4 U, a- `          }
2 ~8 N' t* ^7 Z7 H$ R5 `           int bak = count.get(c);
& Y7 ], k. m+ X           if (bak - k < k) {
$ ~1 k- E8 \) S! K1 D               count.remove(c);
% g1 {- M( I* c          } else {! f, |; E! ?" z4 M# c4 o; o6 n- a
               count.put(c, bak - k);
9 W  ^# ?' U/ P$ Q& ?/ P6 Y1 D          }2 Q4 t% q5 W3 ?3 ~1 \
           String r = solve(cur, count, s, k);
% W4 i4 H4 s, _           if (comp(r, res)) {* v/ t  P* f& z; S
               res = r;; X2 D2 _9 h0 z' q" c& H* w" i
          }, ]5 p5 F6 U- O$ W
           cur.deleteCharAt(cur.length() - 1);, c. J. F* r: F  }/ e
           count.put(c, bak);
- R  z( B! W+ H4 W$ h' e9 n      }2 V6 _& y; @& {( J; }9 F' V
       return res;+ y' g1 [' T1 o
  }
, v& x5 w, B! W" ^0 M
/ @( C1 Z) J5 \1 u   private boolean comp(String a, String b) {, a2 A/ e, x: \* X- y" @$ r' F
       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);
, _- [4 O5 P, ~0 b; q& S8 f0 [6 b  }( a1 L9 B, j4 _5 u+ _9 l# U
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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