找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 执行操作后的变量值】$ ^1 i9 W4 Z  n) k  G: g
解题思路' o% q3 j  j9 U4 r, A; _
签到题。8 N/ d$ \% }$ P& N  i) f* o# _
8 `3 `! b6 ]* \5 M# S: V( Q
代码展示7 H' P' g# R5 H* ~4 k
: R: N9 ?% X$ @
class Solution {) ^( D+ r( v) M+ y
   public int finalValueAfterOperations(String[] operations) {
" N" t" ?' J" d0 Z9 T       int v = 0;
, R5 B2 [$ g5 n! p/ h* H* p# @       for (String op : operations) {
; J1 ^, S3 C/ d8 v" ?           if (op.contains("++")) {
5 v2 b" d; F$ B+ q7 |5 b- w/ C9 P               v++;. [' G% b; Y0 T$ G6 H: h; p
          } else {$ }& p: _5 H9 G. I. l5 d) n
               v--;9 h0 ?- z" S- |8 a' l) a
          }) U$ t$ f. U* Q9 x
      }
: o  g: r3 z* e" u% e       return v;: h. F% `$ O  n+ q7 e
  }0 C5 B3 z4 i% g
}
" J% w2 K; ~# }" C: N, x
3 e! y8 G" z5 m% O3 c6 I【 NO.2 数组美丽值求和】3 u( H& e; O. C6 J% m, r4 A6 K

8 {- u' y% Y3 u" ~; k8 O解题思路: u( k7 N/ e7 S
由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。/ h8 r! d0 Z/ e% l
% v/ ~  @* N3 N
代码展示
& d0 U$ L* N1 S" O9 b
( Z" h8 e6 I' E& }class Solution {) \; p+ P8 J4 p2 }# M
   public int sumOfBeauties(int[] nums) {( b. D. L8 i! R6 [
       int[] preMax = new int[nums.length];4 u9 {, Z& [% X8 C3 G
       preMax[0] = nums[0];! ~, ~8 a3 h" M1 ^: L6 D
       for (int i = 1; i < nums.length; i++) {
6 p% z& A; T0 x- V7 l& h; N           preMax[i] = Math.max(preMax[i - 1], nums[i]);# t7 T1 O. C/ W9 ^1 P
      }, @0 P) W& T; W( n$ h" }: O
       int[] sufMin = new int[nums.length];
/ }" z& }- ]/ a  d# z3 S2 L       sufMin[nums.length - 1] = nums[nums.length - 1];" M8 W% e# G6 c9 ~
       for (int i = nums.length - 2; i >= 0; i--) {% q& o0 b1 w/ Y, y0 x3 _; J% w  Y
           sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
0 T7 s! V% J0 P! K0 G/ o( g      }7 j, I6 V$ q% N
       int res = 0;( n  X1 V# D$ p- X% L
       for (int i = 1; i < nums.length - 1; ++i) {- {0 M7 h9 ^, `1 T* \: T" Q
           if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {: O* f8 O! V6 z3 K" E, s% `& }8 N$ o
               res += 2;
% P* \/ o$ }9 ]5 T5 n          } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: I4 C# y* n& U5 O               res += 1;! l# [# M# g8 H( C" s" q
          }& A/ G' [; j& A( |, _6 w
      }5 v( p4 i& m* J) d" e" |  p" Q
       return res;
1 X9 i! ]) m0 w8 W/ K6 {  }
9 i( v# i3 |6 W+ J; P  i6 S}- F$ V# o4 _4 s/ _, C

+ ?$ J  V0 G2 O6 T【 NO.3 检测正方形】
- H; x4 O6 D& M1 Y$ m, u* z2 ^8 Q' i5 ]5 R) j
解题思路
( ]5 ]0 C! V9 q( u  k& _) Z使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
& v* L+ y: b; [. k  {4 V) \8 m. r: z# p
代码展示
; s4 R+ _5 P7 D( u: Q0 c1 C; n! ^  b
class DetectSquares {# G3 ~$ |. `& K- S+ l' T3 T
- }1 }/ s2 X* c5 t
   Map<Integer, Integer> count;
' @; S: n$ ^5 g& Q
" \6 R$ ?, @+ i) q7 S7 s   public DetectSquares() {
. ~4 _* j# a' F5 _       count = new HashMap<>();- J' r" X8 L# Z% Z4 o$ a; N# U* \: C
  }
( y$ ~6 Y3 i0 J
+ U) Y% j$ W0 C; k2 w   public void add(int[] point) {
( E5 l* C  B, T; q. U6 n6 t7 ~; l       int c = comp(point[0], point[1]);
+ x$ a+ F( A" I* d2 Q' [2 }1 M       count.put(c, count.getOrDefault(c, 0) + 1);. o. F  G9 a8 R* O  G! [  d" Z
  }4 K, h$ ^( m& E. ?6 j
5 Z1 `! _. g) ~5 z! S
   public int count(int[] point) {
: V, u- Q. \7 N( p9 q; M7 f2 x/ E       int res = 0;
+ H# G" k; a& ~1 d, }       for (var kv : count.entrySet()) {
* s! m6 y+ g! e1 p: ~  Y           int x = X(kv.getKey());; L- a2 U& a; g( _# ?5 d9 W: f
           int y = Y(kv.getKey());
2 y1 Z$ ^: l( l' ?3 {           if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {
1 M  p0 {- x8 v               res += kv.getValue() *! R9 u. c- M( b6 M4 T3 f! D  Z
                       count.getOrDefault(comp(x, point[1]), 0) *
$ ^6 L% _6 a- B3 _6 c% y                       count.getOrDefault(comp(point[0], y), 0);: D- {5 y3 f% G& M: r- k
          }% g1 y/ T" {. u- q. m
      }4 x" G! t0 T( f: c; B% b
       return res;
* Q$ s# s" ]% K4 o3 E  }) B# W  B: R% i; c

' M: N: D1 P- y" x3 X1 P: K   private int comp(int x, int y) {
- M. G: {0 y- n- L       return x * 10000 + y;$ V& S) b* {8 a' w
  }
. u( Y- n, }7 o/ z# C; T# Q. d. B
  d' H+ j5 X5 B4 e" v   private int X(int c) {
; X# A: G$ X& Y2 c! E       return c / 10000;
$ u% {4 j, t' f* h+ G+ h6 ]  }% a: H8 B) t8 w5 j

' ~% y8 q; k# V, ^3 Z% F; o; Q" ]   private int Y(int c) {( R; }+ g% b* S  x$ J* H
       return c % 10000;/ Z8 T8 n+ f: _0 T
  }
3 A; ]% g1 L% ?  c( U8 k}
3 P% Z  E* Z1 D; h" j0 V+ r, u( Y0 R* t+ Z; Y" d# j
【 NO.4 重复 K 次的最长子序列】
# C) j! J" b$ n. @) S) {
( H' C3 i, Y! t6 ?: C: w- y/ A解题思路* j" `) H3 Z  e8 N+ K
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
6 _7 _8 B; ~6 R- f
8 H- a. `1 b7 C' P4 g8 }我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。
4 f  L, x4 x" j+ r5 T  I8 m0 A% m8 r$ ~2 a
代码展示1 {9 I; _+ L( m0 w% @$ u
2 B  O- \5 M! V
class Solution {1 a+ G' }$ t4 f" C
   public String longestSubsequenceRepeatedK(String s, int k) {
7 l" j, Y1 }; W       Map<Character, Integer> count = new HashMap<>();
$ ^' U% ?3 }2 A       for (char c : s.toCharArray()) {: F  ^* F& H8 s% G5 x0 S& }! _& U6 h
           count.put(c, count.getOrDefault(c, 0) + 1);
5 q! R$ [6 t$ y) Y$ `      }
5 }7 c: z+ @+ ~3 Z* M( N       StringBuilder s2 = new StringBuilder();6 |! \8 g' F( ^- ?" }
       for (char c : s.toCharArray()) {
; P3 M) r8 p3 a" D$ g% S* x           if (count.get(c) >= k) {9 ?: G, I! |/ ?5 e- r6 m
               s2.append(c);
# ?: w" X$ v* }          }
* S, t) J- e: t' g      }
$ t. f" O, Q9 q7 [# l$ O! u       count.clear();, z' m1 \  |- M2 \8 e- u1 m
       for (char c : s2.toString().toCharArray()) {: u, s& _' F9 j$ r% k/ R1 ]
           count.put(c, count.getOrDefault(c, 0) + 1);7 ^0 R  h5 z5 y2 V4 ^$ n5 j
      }" j, H: _4 w' ?
       return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
: S0 w: h+ j( C/ Z  R. D' ]  }, v" n8 T4 v! o% g- q6 l) B
' B  p* J! K: c. Z" |# g1 y
   private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
3 @7 z7 `7 O3 U8 P       String res = "";
0 d+ l, e9 s: f; p" o5 M4 w       var keys = new HashSet<Character>(count.keySet());
% @) {# F# k$ _       for (var c : keys) {6 ~. N7 G+ J/ H. N3 @' ?) u5 @
           cur.append(c);: e/ D3 P/ h7 r2 z; s
           if (comp(cur.toString(), res)) {
* u* l0 I2 e4 h  y3 k; V               int cnt = 0, idx = 0;% a* }/ [. H  ?5 q
               for (char cc : s) {( ?5 k1 n/ C: ?. x6 r# C4 V
                   if (cc == cur.charAt(idx) && ++idx == cur.length()) {- o( J( p, r8 n6 k; V) w
                       idx = 0;
7 b) b) |; K; i7 _! d9 V5 n                       if (++cnt == k) {
) z: K6 J, _1 ?4 D                           res = cur.toString();
: H' o( Q" `& N! x                           break;
/ f$ h4 e0 Y1 {( k0 z8 _                      }
6 B) H6 U3 ~" l                  }
; s% W  L* c" h" _) V' c; P6 Q. E              }  T  U2 W  _7 Q
          }! B9 v9 n% \# B7 o) p
           int bak = count.get(c);6 F( E( Q/ K8 @: L
           if (bak - k < k) {
! k! I+ C0 _+ q* i- K% }               count.remove(c);
* \- A4 q2 q- v& {$ a. @          } else {" ?) x& V/ B* J& [4 B  w
               count.put(c, bak - k);
" U* ]5 N% P7 x: F% B          }9 c7 o+ U0 D5 L
           String r = solve(cur, count, s, k);
4 p" s: }: }; x" b' H4 z           if (comp(r, res)) {2 I7 S' i4 a; p
               res = r;
/ w# a6 S5 z2 x& @. q          }+ x! s1 z, \/ \4 b+ s: [5 L
           cur.deleteCharAt(cur.length() - 1);1 W% @" z3 d7 M: z
           count.put(c, bak);9 u0 |2 F4 j% e, s/ R8 E
      }
: D8 ^8 h4 ]7 K2 D       return res;
& w1 M! V# o" z- _3 c  }
4 ]. E+ O6 {8 T
* O4 ?* a7 @9 V! x$ G" j   private boolean comp(String a, String b) {) F3 H1 i; h6 u- ]: q$ k( n8 j
       return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);# f+ M7 L8 F) n: Z8 f
  }
+ |* o& z% Y! F4 }7 t( e$ p4 F}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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