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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】) b, L9 s) r) E3 A0 l2 V
解题思路
+ ?1 Y) C7 s  S2 O* E: a签到题。0 O4 f: ?$ M' ^! C+ O% y/ g
0 \7 T* G2 z, e% O" q; v2 R
代码展示
9 g* x! U: @, ^) {. \
1 p& Y6 A% F$ x$ Yclass Solution {) ~' @5 a% i( l' n/ I2 R  P
   public int finalValueAfterOperations(String[] operations) {
3 C3 _, S, l2 m& a# B       int v = 0;
% c  U7 k" N8 Y% v  b: n       for (String op : operations) {
# y0 E4 o; ]. b) b+ j. a           if (op.contains("++")) {% P6 V- B$ x# z' }, n6 k) M, N; {3 b
               v++;
8 s+ L5 @" E: }# _7 J4 J' ]          } else {: x' r8 m4 }% A0 e0 h+ B! i
               v--;
) r6 b% R) M9 n9 z4 f          }, g9 B. n8 a  D% [. ?
      }1 n3 |' z* ~! C5 {9 g/ o) E
       return v;0 K$ q& \9 b3 Q- Y
  }
% e/ Q" M; _! ]& S}5 X% a* v7 b6 j/ \9 b

& P1 i" c1 x! z0 _% W! m【 NO.2 数组美丽值求和】
# Q& `% L& n1 i. q6 e- G! M1 \. U1 G! s4 `7 W( C
解题思路
" \+ _& S' S* \4 g7 C由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
/ R- s7 o1 Q$ Y& l( Z3 ^, q
1 `& c9 t( K2 A9 A& A7 Z代码展示
2 k0 M% v2 D6 G6 y5 ~3 [
; E* B- j9 v$ K) Vclass Solution {
/ G0 A, e7 X" I; A' I! [3 j8 u$ O$ O   public int sumOfBeauties(int[] nums) {$ g7 S9 _0 _7 I8 f- A( f
       int[] preMax = new int[nums.length];
) Y, f6 ~+ U" S- L9 ]; S       preMax[0] = nums[0];
; o/ z( t4 m- R1 M8 O4 H7 N- n       for (int i = 1; i < nums.length; i++) {2 j" B- E" ^4 A( L# P% R
           preMax[i] = Math.max(preMax[i - 1], nums[i]);
7 e& A" ~/ f$ w/ I: E: L      }+ W) E' q4 q8 ]. Y9 a
       int[] sufMin = new int[nums.length];
) f' A- s/ b9 f       sufMin[nums.length - 1] = nums[nums.length - 1];! s% I2 x9 f' A/ i& v' F3 X* C- C
       for (int i = nums.length - 2; i >= 0; i--) {' C; z* X8 v( j9 @- e9 p
           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
1 i; @3 V6 m( M5 w' h9 w      }$ M. V/ w. v5 J  e
       int res = 0;
, ^- A; t0 {% D* z       for (int i = 1; i < nums.length - 1; ++i) {
- k4 x) b% v3 U6 D6 [5 S, h           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {( \' I3 R: \$ ?! w
               res += 2;
. G  q9 a2 E) s8 @          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
# b) L2 q# g: c               res += 1;! R) T6 @; Y) O" ?( D6 m( n; ~! w
          }% f( t: t5 |  ?, M
      }
  F0 c: h: ]5 {0 ?       return res;
0 @' t& |4 g# e2 c  }: N. S. t5 ]% o: P1 I  X
}8 D# t9 h& Z; n. p+ [; [

1 z$ W2 Z6 p$ r( e) T+ Z% Y【 NO.3 检测正方形】
6 P, J* r5 X+ o; o! V. K/ o
) n$ L5 y# g$ r6 L% i* J1 T2 Q5 O4 z解题思路3 F5 I" C( p  T* O3 b/ n
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。6 K8 @% g6 Y, e. \
3 ]' S- o: [  @9 v
代码展示& T3 u" z6 F% g4 T; ?
5 d/ s6 W# k& @1 Q' N% F
class DetectSquares {
0 e, }1 N/ L/ Z! H* ?# k/ V7 h) u
   Map<Integer, Integer> count;
! S8 O  R9 q" h; M: s9 u1 C+ B
3 u( J7 t2 H9 R8 I* n( t   public DetectSquares() {# n& W2 X3 h9 o7 e( Y: P2 C/ P
       count = new HashMap<>();2 \6 L. c% [% i
  }
. Y+ e$ ]% t5 ]1 a- J; U- T
* \, \* \* F, C" v3 t" P   public void add(int[] point) {( m( p7 X2 n+ R; O  \3 @& j
       int c = comp(point[0], point[1]);
/ a4 W) i2 z. P7 C       count.put(c, count.getOrDefault(c, 0) + 1);. k; X( r% ~5 t2 g7 U: n* ?$ L
  }
0 `) q9 Y: G' W* B' B8 f6 k  m
- Z) M$ F$ Z$ b7 u: l5 X   public int count(int[] point) {
- Z  j  r, ~" _6 d1 Z* r       int res = 0;
$ W, b% H% }6 w* h+ j       for (var kv : count.entrySet()) {: t$ v7 q' e$ ^+ c% H
           int x = X(kv.getKey());" b6 y. e5 o6 [$ |8 b
           int y = Y(kv.getKey());
: T" H* P5 Y1 x           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {
1 F) ~2 Y% y. A0 P- {0 L               res += kv.getValue() *  P& Q  N0 i0 P, F5 R( b" o
                       count.getOrDefault(comp(x, point[1]), 0) *
* T& N4 `7 n. B8 t0 l. V0 V) t3 D                       count.getOrDefault(comp(point[0], y), 0);
$ ^* ?: ?# {& ^/ h9 `/ Q          }6 f- X& d  x0 }: w
      }
9 }) ]% H1 `# ?. G% P6 M0 v       return res;) W. p8 z& b+ W% [( u% r% I- G8 q
  }* t* B# a+ E( E. E2 @7 \
7 r9 p" s' P; g; h- N4 _
   private int comp(int x, int y) {- @7 ~; R* w8 ~; ?2 l+ V; h, [
       return x * 10000 + y;
" M0 n6 N0 G  G4 a7 _4 h$ {  }
8 w9 ^- a2 a# i& Z4 }0 I( U4 J1 n5 T
   private int X(int c) {/ \* m* E5 ^' ?
       return c / 10000;1 v9 R' \- d, g% c- s
  }
3 Q" }+ D% b+ `" Y8 J
+ s9 z: j7 ?8 S   private int Y(int c) {; ~; W. \# [- w6 v. w8 l
       return c % 10000;
* A  h7 C  ~5 Y* K/ I  }* Z2 `: \6 @. X
}
) r) O! G, u% o( v) R. U3 ?1 N) [5 j
【 NO.4 重复 K 次的最长子序列】
: o  k6 P* K7 ~- G( e, C* c. ~+ J( |
解题思路" T8 A  B8 ~7 u( |) B! Q
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
2 z$ n: k7 H3 ]7 U" U3 Z. k. E* c9 i& w4 ?4 Q
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。' H9 U& x5 a5 d0 e% u
& S4 V  e, v, M
代码展示
/ m' E1 u; E1 X. M/ x) w* y. t& e6 [; R7 b) b" G
class Solution {
3 H- }8 y  |, p# _# ?! L/ J   public String longestSubsequenceRepeatedK(String s, int k) {5 T" S- ]* F& L- R6 g" Q! |6 x
       Map<Character, Integer> count = new HashMap<>();
; ?/ b* d( P7 _  h/ B, @       for (char c : s.toCharArray()) {
% g2 o8 g5 h3 f- u. d# f           count.put(c, count.getOrDefault(c, 0) + 1);
. u. o- u" b& G9 T      }
/ b! w' e/ U+ e: R. F       StringBuilder s2 = new StringBuilder();- ^  Q/ L' i7 B# p
       for (char c : s.toCharArray()) {; B) v% b; s. f
           if (count.get(c) >= k) {+ [( L; H! C; d. Q8 O- w: O. X
               s2.append(c);
- N' J; J* {0 X          }
8 [; |: i% D6 M) v3 N      }( B! O) \$ V! W8 j) X3 m  R
       count.clear();
# [( S, w2 ^2 _- b- p       for (char c : s2.toString().toCharArray()) {8 _4 H( Y) W3 E
           count.put(c, count.getOrDefault(c, 0) + 1);% b7 T6 U; d9 E; y( A$ \
      }, n$ f7 {( c: c2 o2 v. K) ^* t
       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
: K% z8 u* B( T2 q  }* b! D: {: ~/ u" ~+ t
$ J& W/ S- ~# `* r
   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
' E  T' {, S- E% F       String res = "";0 j) H% \5 ^" S9 C4 @
       var keys = new HashSet<Character>(count.keySet());* [$ ], M, d. I8 \! g
       for (var c : keys) {' g% _4 i9 R( C- e( u, l
           cur.append(c);
' [3 s8 P2 C7 P           if (comp(cur.toString(), res)) {, q5 b6 u, [3 h* Y: s) d0 ~& O
               int cnt = 0, idx = 0;
; l& j! p+ w4 R" C( B6 Q               for (char cc : s) {
# R0 L2 r4 `; y6 M: w# z                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {/ Q9 l$ `, y: g* R
                       idx = 0;
! ?/ b. X  f/ U6 }: x                       if (++cnt == k) {  O% s  N* N" ?* F% O
                           res = cur.toString();
2 q1 S. |% |* ?' v/ ~- S! {( @8 E7 I                           break;
: D5 T0 c$ _# H2 c# A  M) _                      }
) O* }- q0 U7 Y4 v                  }8 f" p- {( Z, y$ ?$ h1 I
              }
- i  {# I9 q! _" U  i3 `          }
. Z& n6 m" i+ A3 [           int bak = count.get(c);) V' u6 N7 p: h! L4 `
           if (bak - k < k) {9 m0 O9 p+ x1 z; j
               count.remove(c);. J  t2 R) G+ ~5 w/ G
          } else {- j! e" b6 k- I5 n* m
               count.put(c, bak - k);
/ b8 j9 K: [2 V          }7 k7 e$ U: `7 C  z7 Z6 S% S
           String r = solve(cur, count, s, k);
: V& @! o( i8 z0 H* U& O1 u" E           if (comp(r, res)) {( P  I- M- E& O3 q" J& T( \
               res = r;+ D( ^4 r4 E' [9 k
          }; [1 F3 c- W! |& W% N' ]
           cur.deleteCharAt(cur.length() - 1);
( B* y% m: j9 V4 t4 S           count.put(c, bak);
) ^: v2 |9 O% a! V$ u. Z5 o      }
7 E/ M3 w" ~( v' o  \3 @! e: T7 y       return res;% V0 q9 a% o5 o9 m) Q( ]) ~+ N
  }/ q  R+ j; x: s, w/ `+ [$ m7 d
* o7 o2 E% y5 J  n6 _- g' T( K
   private boolean comp(String a, String b) {; k8 H" c: a3 C4 k  y$ ]
       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);) b6 S; L( S; P( t6 x& z; `* [) F# [
  }% \) K/ V0 Z1 x( x. {4 v, S7 a
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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