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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】+ `/ @$ v* E" T; q* o

  L! J7 m. l. V% k解题思路
  l9 a- \" E; q0 [3 z签到题,遍历一次即可。
) l, L! Q5 _" a, m6 y7 h& g- M( R6 Z0 B; j8 O: W
代码展示) v9 f0 c4 q' Y
$ l. A$ x- A- L2 s- q
class Solution {
$ A0 \$ R2 G. v0 Z3 ~   public String firstPalindrome(String[] words) {! j( k4 t7 h/ @
       for (var w : words) {" d  i# [" M4 x- s/ w
           boolean found = true;
# l7 d7 L6 ]& X- z2 D           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {
4 W" F! J$ U$ ~5 d               if (w.charAt(i) != w.charAt(j)) {7 O9 Q$ ]# A! c  Y5 T
                   found = false;& \6 H0 }1 M1 `5 N4 D: Q+ ?9 v
                   break;
) t" w3 \" K* F              }
) O/ ~4 O( T" L- f' i          }
( a) Z6 M$ W  F* P1 C6 W           if (found) {0 B- \7 u; M( Z3 H/ g# \
               return w;( i6 C& J1 P$ P, u
          }
7 y( ~) s* i5 T+ i+ N! x) ^! W      }
2 g3 k# I$ F: _( H' F( N       return "";8 c% a# a$ o; l7 P0 H# i
  }
" o6 |; Z1 B5 \}
6 M( Q0 d* y- G8 |
( Y+ O* q$ T2 S' ~; r) O' B: S2 S3 W, A) m* ^
【 NO.2 向字符串添加空格】
, H! o+ n6 [' a, E% l" }. X+ Y5 [' y1 v) C7 G& u+ N$ w
解题思路
: q5 `; [: Z* ?  X, Y- l& s使用一个 StringBuilder 维护新的字符串。1 ?$ c, g* D; }* w  O) H5 U. O
* w2 a+ }5 J- g7 E9 W3 R$ A2 E
代码展示
* A. y" A; c+ ]! g* N6 k1 Y2 B/ |- F9 T
class Solution {
7 |3 |$ q) Q4 R5 B+ q   public String addSpaces(String s, int[] spaces) {% W2 T1 @- x: T: B
       StringBuilder sb = new StringBuilder();: b6 {* q! L. J/ @( T# B$ q) S
       int sp = 0;
& @9 T% d5 r) [) ]' H( T: \       for (int i = 0; i < s.length(); i++) {+ r, k1 i6 F* \8 V% h
           if (sp < spaces.length && i == spaces[sp]) {) v1 I$ `5 p- k/ N' H9 d: m1 W
               sp++;
3 R. j3 Q8 j$ V* a+ T               sb.append(' ');* Z6 J( G$ x% w- N8 |6 A
          }
( @! j2 m4 }" U7 M& z6 B; G           sb.append(s.charAt(i));
/ Z6 f. M& d* F$ q; D6 x, j      }0 x; i% a& d9 T. y) G! Y5 i
       return sb.toString();5 c; e0 w, b4 Y' _1 s
  }
8 ^* b" b  }4 \6 x" M' ]}
3 w$ a4 Y2 U8 k0 J/ C* U
5 w/ i0 x0 \  X. a/ }% `, \
% J. o& n) w$ \+ ?# _& C【 NO.3 向字符串添加空格】2 C# |. q+ ]# r4 f- V5 R1 `4 o, m
8 G% o! A6 q4 [7 M
解题思路  @$ G* `9 A5 K" b* H
双指针。
; g6 t7 v, g& Q) w
8 S8 N& m8 l. ]代码展示6 s+ O' s- [! }& B. [$ B
  [$ W/ H) F8 G. @! m
class Solution {
5 j2 \+ v/ Z$ }* c   public long getDescentPeriods(int[] prices) {
# O$ P  G5 `. [. E% t; w# l; I       long result = 0;8 D( s1 c0 ~9 `0 K  F% U
       for (int i = 0, j = 0; i < prices.length; i++) {7 y/ \4 n) S2 F4 f4 b
           if (i > 0 && prices[i] != prices[i - 1] - 1) {8 x/ k& ~  ?- D2 I! p% q/ T8 K
               j = i;
/ G8 {. |, d, C& @: s$ K/ m          }- U7 d5 y, g7 M; T1 O- V
           // [j, i] 是一个平滑下跌阶段& {, D1 Z, [0 _) d5 e+ X5 a3 `/ I
           result += i - j + 1;
: j0 q/ c  d7 T7 m3 w7 n      }
7 J% ?; e+ F) @+ C3 k       return result;7 Q9 L- W. g4 {3 p5 T( a
  }& Q) ^! B4 e' c* h. u" z
}! }# A1 Z; d4 b

* F; Z# Q' G# W2 q" k( [8 a
7 m; n( T3 |" V/ x3 l' D【 NO.4 使数组 K 递增的最少操作次数】% {7 d/ T. z7 D1 X3 v' @) F- x! z
- e  y9 h4 L2 s( G
解题思路
) }* k: \. z) `3 a! n! @5 ]3 Z% P原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。
; i" T7 y8 T$ q: w) H9 l4 y9 r
+ F6 ^  \7 d! s9 s然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。
5 B% e$ ~4 z+ p- ]8 u6 N! e6 D2 |" `8 i+ n/ t5 L/ I0 Z
代码展示8 f2 z. z6 B2 I+ g4 {& i4 }

" h! [# |( C* g* S7 h# Iclass Solution {
) O- c' u5 h5 h# Q2 u3 I1 {- H$ S   public int kIncreasing(int[] arr, int k) {
! ?7 A+ m* M$ Z8 F) p0 F8 U+ P       int result = 0;% J) n2 L, {# s& U1 x" v: c- B
       for (int i = 0; i < k; i++) {  V* J0 {$ O  T- o4 u
           List<Integer> list = new ArrayList<>();
* m: H. ]+ W6 |1 p3 o0 J           for (int j = i; j < arr.length; j += k) {
# _3 w# J( {  T2 I# J9 m: _               list.add(arr[j]);4 ?7 `9 }  Q" d; U6 t
          }4 Q; p3 ~2 Y' {) [. ~' Q
           result += increasing(list);
% q2 W$ [9 e/ C' u      }; v* s6 Y# T) o. m- w" H
       return result;
/ t# u+ D! ~! b  }) {. X& a" s& l1 l* z! h) c
( T' c6 _' V& m
   private int increasing(List<Integer> nums) {3 T# {4 K8 Z. Z( n+ K
       // 将 nums 变成递增6 X# A' }  Q  W3 H7 a
       // nlogn 求 LIS' c- }! J( {; c$ ~/ ^
       int[] dp = new int[nums.size()];3 N( k/ c& q. l1 `
       int len = 0;
) z" o+ {, Z! h8 r9 S- \4 U       for (int num : nums) {  }6 h" y( K7 [  P: B5 e: \) l
           int l = 0, r = len;+ T' D- T& u7 n3 T
           while (l < r) {
  X5 B+ z  o8 y: C               int mid = (l + r) / 2;2 @- N/ ^, H9 M/ Y, _+ R0 t
               if (dp[mid] <= num) { // 非严格递增,等于也可
7 F1 ?# {& e* a! _                   l = mid + 1;) i: U* _0 y  M5 P
              } else {) a+ T- j$ d+ Q9 {. y% f5 m
                   r = mid;
& z7 P8 `  l0 s' s/ A              }, M$ Z  ^! M/ u: m% J5 W- T
          }" S( o) \9 r- A9 h! h
           if (r >= len) {2 o# t/ \6 Q$ y, Z1 q
               len++;$ ?$ d8 j3 ~7 n2 b/ Z
          }
% R, y/ U6 J( w$ c" o; a* ^           dp[r] = num;7 L) k0 |9 s( {2 H( g
      }& R4 ?) e8 j& R9 D/ h# i. M0 x

8 ~+ U3 U+ M6 f& e$ P2 f; n       return nums.size() - len;
- D/ a( M, \( ]# F* v# x  }4 S  A4 s. s5 W; ]0 c( H. v
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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