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

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

上岸算法 回复:0 | 查看:2719 | 发表于 2021-12-21 00:08:58 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】
& `/ b) k( L( \/ E# K. b0 Z
  p8 ]+ g' n; R, Y  I% [& ~% N解题思路
' @- n# T7 t# B# i2 p' i0 S& f签到题,遍历一次即可。/ P/ Q" }6 ~0 T% z7 `& I0 m6 |: d
. p, t& X. q+ M( l" T$ t
代码展示
1 g. ]" I* T5 ]; D1 w+ \! U5 z2 n7 \9 W; d; p* K# B
class Solution {) n% }" u/ F8 w) ~- `9 s- J' V* c
   public String firstPalindrome(String[] words) {
( Y5 P6 I3 l" W2 l1 _1 R       for (var w : words) {
; i" Z# [" p; I! w5 l6 u           boolean found = true;
* v, \! V+ F" b3 r, [           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {
5 b! a5 ~' [* I, {' w               if (w.charAt(i) != w.charAt(j)) {# u8 b: t: R" N) w' n( l
                   found = false;' ]" T. I  c$ s# j6 g8 u0 q
                   break;! v+ G3 v) m0 x# Q0 [' b) W7 Q
              }
% N6 ]( W/ G) K7 ^' M" d          }3 q- i6 ~$ c+ }: ^0 |8 k- n$ B- v7 }7 u
           if (found) {
3 t! N( u4 ?! u+ M               return w;
! m: C# V0 J: q0 ^  j          }
( t1 v" o, Z5 d1 M$ d, T+ b( n6 Z; w      }
& U4 s, y. k- T2 {, N4 G' A       return "";: V+ G9 @) x& J( V) O. Q3 {
  }/ c0 H. n* I4 C. w) b7 \+ K/ v
}
0 X+ }2 H" t% i9 j
# z, O+ V  J  f* ^1 \. A" z* Z2 M+ T( t6 _( r: A$ e3 ^
【 NO.2 向字符串添加空格】3 Q2 w* s# m# `# C8 ^

# t' ?) ?. |2 W. f解题思路
3 N6 q  h4 J9 k- _使用一个 StringBuilder 维护新的字符串。% R# [! ~3 J0 O; }1 P

0 k0 b9 a; f- D9 D6 t; E* R代码展示
1 p% x7 f! f, q- p* `  G0 E( d: V/ ^. O) q' T2 {4 x0 k- x$ C
class Solution {
( A" I) g5 u  z6 ~9 ~( D% k   public String addSpaces(String s, int[] spaces) {
, s% j) B& z/ v. K       StringBuilder sb = new StringBuilder();( ]+ _7 H! e* E! K) ^+ O5 ?
       int sp = 0;
! F2 G. f. v: P       for (int i = 0; i < s.length(); i++) {3 v; D$ d3 X0 g. U! N( j/ e% a
           if (sp < spaces.length && i == spaces[sp]) {0 u3 ?( z1 l& A! J
               sp++;
, W& v8 w7 u% ]               sb.append(' ');2 v8 G$ k- v9 b3 A
          }
( K1 H4 ~* U. C           sb.append(s.charAt(i));# Y% K$ G+ v' S& C. [
      }
' @1 T, {0 X' J! g+ _" g       return sb.toString();
* A! u2 |# J' n# P# l  }
/ s* P8 G4 _1 I}
+ [% |2 u) i9 d) z7 ?9 }, N8 J2 v; _. J! p  s8 x3 m+ v. m8 M; e

  s2 D& Z2 @- ~$ L: ?" Q) b【 NO.3 向字符串添加空格】
# D! q7 g1 c5 y3 H# m# F  A2 P/ V( B5 E* q3 Z% S7 v
解题思路
" ]$ S( o3 a* n# B双指针。# S. O& [; a! a; D2 }

! a1 ^: A8 R. {0 t: X0 B代码展示
2 j) {# z! F+ Q
* ]3 ]$ Z3 D% {9 T$ _class Solution {
* a+ k1 o5 i: N/ v5 ?/ N0 E   public long getDescentPeriods(int[] prices) {
7 j) B- m: S2 |6 ~3 s# ]7 j       long result = 0;
; K% G' Y7 ~4 Q       for (int i = 0, j = 0; i < prices.length; i++) {
8 t! Z" c+ d  t           if (i > 0 && prices[i] != prices[i - 1] - 1) {2 a3 ]2 G  x4 G/ d: U) E/ \  X4 B
               j = i;3 h3 i8 U/ y! f  i7 @
          }
& `. @& p0 \# g0 E5 I           // [j, i] 是一个平滑下跌阶段8 b: A8 @0 j4 U" g/ z+ o5 \9 @6 O6 C
           result += i - j + 1;
' O. W; X$ W9 G! a3 y5 d      }
, x: F% D, T, X' k8 I% M       return result;$ `. q' @9 j! H: c4 {( i4 K/ |9 c; l
  }
; o& X3 V7 M* ^6 n! g}
7 |7 B5 U6 s% i( a3 E  C
, w6 u+ G+ Q% K
8 J% x; w+ @1 Y  m9 L: U【 NO.4 使数组 K 递增的最少操作次数】
% v4 ^- A5 w5 R4 q( s# a9 \8 @1 K  T- h& v  h
解题思路
% g: t* H2 p- P+ l0 z$ V* o9 g* }原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。
2 J+ e4 T5 p1 f" D1 f5 M& f/ s" ^4 r& v' K9 `8 U3 V7 v
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。8 Q. i1 s7 v& G
- y5 z5 M) Z, O/ J" w4 l
代码展示9 V) _  h6 X. u% Y$ n) c

5 Q) H. D/ V4 t4 i8 o* Rclass Solution {0 q( e/ i5 f/ p
   public int kIncreasing(int[] arr, int k) {
: O5 g" v2 I3 o" _2 N       int result = 0;# `- ?4 q- B6 G8 l- x/ x
       for (int i = 0; i < k; i++) {  @1 K$ R5 y5 K" ?3 d# b
           List<Integer> list = new ArrayList<>();
! h( @  q- J9 ^" Y/ L& s7 q* Q0 O9 z           for (int j = i; j < arr.length; j += k) {* Y* _: y" L  W% \+ ~$ i5 {
               list.add(arr[j]);3 Z% V4 g3 P1 R0 z0 _
          }
* e6 b  d- W9 |. L  e" \2 A4 T           result += increasing(list);0 N4 g% k% o: E
      }
8 x0 v5 P7 D( l: n       return result;
8 y& f9 c4 z7 ]) j& D. `# X  }
* A2 P1 d+ z) o, ~, f0 `. ^7 ?9 I! Q! _2 L8 w5 C, w
   private int increasing(List<Integer> nums) {2 W) k6 |' e% L( e9 x/ [4 |
       // 将 nums 变成递增
, Z7 b& Y8 S3 J: i4 C       // nlogn 求 LIS
. F4 b4 x5 R) y9 \6 w8 E9 j       int[] dp = new int[nums.size()];
7 |% @$ T6 Y7 c1 t* D       int len = 0;* _, ?& S3 O9 o% P/ p! H# j! t
       for (int num : nums) {
- d% Y  v- @( \' T! G6 p$ u. Z' {8 H           int l = 0, r = len;
, x5 l5 j3 z' |4 n9 P) r% O3 z           while (l < r) {' U) h. ~/ U) m7 J
               int mid = (l + r) / 2;, E( g3 q. b, R! z
               if (dp[mid] <= num) { // 非严格递增,等于也可% E4 i/ j: u( @* \5 |7 N6 y
                   l = mid + 1;, K7 i4 U7 T! X) U
              } else {: r! U4 }# Z7 M1 H+ S- u
                   r = mid;
3 B" _2 t! |$ T* _$ s              }
5 j/ z3 _3 k9 B          }3 ~, M; z! _" l2 ~4 f: U; D
           if (r >= len) {
& m6 Z0 [' n) X' c: l8 _               len++;
! B3 u9 p) H( G1 D; t          }; a7 ^6 q( ^5 I0 u1 H
           dp[r] = num;: l8 N! j* G, q. m4 C) D: B
      }/ d& [. [+ d: a. y+ z) Z+ u, Q
2 f6 |: ?0 p* R- @7 @
       return nums.size() - len;
: x) G: h1 [* P, y" H' [$ `0 M# [  }# s9 \1 U' @% s3 ^( r
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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