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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】
( m+ P! }0 F0 C7 |7 y
2 C5 l3 n0 f5 d4 D8 B解题思路. S; {* ~/ f& `6 l5 ?7 s
签到题,遍历一次即可。% U  _. `, h$ Y+ a1 \! s* d

6 b0 h5 x; l  p, M代码展示1 D& ?$ R4 W+ k+ }

- H) X' S; U) d9 U/ H2 ^7 s+ F! tclass Solution {
  n7 p# Q- l( X   public String firstPalindrome(String[] words) {9 [/ v) m0 w+ A9 D
       for (var w : words) {
0 o, M0 P: u6 Z           boolean found = true;
4 Y: V7 v# A+ M+ B' `' a6 A           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {. q9 s, ~6 j: h" C
               if (w.charAt(i) != w.charAt(j)) {. N4 C* c% P. h
                   found = false;. K3 i" J. g) Q2 n9 \. _
                   break;) t7 P  d  @0 x' n" K. Z
              }
7 H( l/ A# G( _6 t9 G* ^          }
4 j3 ^) S9 K1 z           if (found) {
9 a9 G3 h, O2 P+ n$ x9 i0 T- ?+ }               return w;
4 O* z7 C- \. j" J* U          }
' l, o! B! p9 S      }6 c& {! y% F0 c2 K
       return "";( I6 T/ W1 X2 p, R/ a" Z& g
  }
: o% @& \0 \4 m3 u" `% ]}
) B9 j  i8 W4 ^/ T
5 |  W& E) [: |  p+ V8 I6 o; {8 `3 y, i' F$ }' x
【 NO.2 向字符串添加空格】
7 e6 G% S' m$ {  c/ Q
$ h& i, x5 a$ ~% J$ @# v解题思路
$ Q1 z+ [1 s5 M使用一个 StringBuilder 维护新的字符串。
9 z) I2 Z# |1 A0 l* n% ^2 i' G. q/ S% k  W# Z9 V, _, L! d" n# I
代码展示
0 K% K) N9 S( S; D4 ^/ X
- S( V8 W0 K. o' f$ p; n, aclass Solution {$ P( w1 u+ H- u* V& G$ H
   public String addSpaces(String s, int[] spaces) {
' O* X1 y; R: @! G# q       StringBuilder sb = new StringBuilder();. L+ Y; }2 E/ Q2 S
       int sp = 0;
3 @  \6 r8 A: _' |( ]       for (int i = 0; i < s.length(); i++) {7 L$ Y0 i' R2 {" C
           if (sp < spaces.length && i == spaces[sp]) {& Y, J0 O. [7 F# c* V
               sp++;
# n& P' O% R& U               sb.append(' ');/ q1 k+ X) ]) `, w7 G9 ]/ D
          }
. \, P& F/ M! r2 |4 u           sb.append(s.charAt(i));
1 w9 ]+ O$ l+ c3 e1 A7 E$ y      }2 u; v& \) b% A3 Y1 d' y
       return sb.toString();2 K  s. U" e+ Q. O) v, _. y: |0 C2 h
  }" ~0 S2 I; v+ u7 y
}
* y; ], t( `& q) X& F$ Z4 x
& T1 P4 p- L, g+ U3 f
" h& Y2 c. Y9 C7 }1 }1 W5 i【 NO.3 向字符串添加空格】
9 h) N" a0 v0 @8 j' r9 q0 k0 O( n( i
解题思路
* S+ U" z& ]# x; m; Z" j' X. U9 E双指针。
3 P3 K7 {+ q, V/ w0 k! X8 i" \7 e6 q* ?. [! F8 i4 N7 H: G
代码展示" _# ^5 {# T* l! K6 b8 y
2 R& H: M" E- N0 F6 b  n& m
class Solution {
7 f& G, y+ W. W6 f   public long getDescentPeriods(int[] prices) {
; u; H' x- I+ R' ]+ q       long result = 0;* L2 m' Q: h. B9 T( ?; l& g
       for (int i = 0, j = 0; i < prices.length; i++) {
: v# @/ u: y; p/ I  p, J* e           if (i > 0 && prices[i] != prices[i - 1] - 1) {- S) b: C3 t% R3 d1 ?" A' U# f  Y
               j = i;7 m" ?  {! l( s. y) v# S( F
          }& B  x9 o' R9 m' m+ k7 p/ L/ d
           // [j, i] 是一个平滑下跌阶段5 I! U7 n( X! K# v9 I
           result += i - j + 1;
- g, z  v. {$ n( j( K. z7 K) R- D- K; U      }
+ v- N& \2 O' d       return result;& C9 }' H) C8 f# t/ }
  }+ ^& F; e' O; Z  c9 F  H
}
4 c& n! Y3 Y* M# w- M0 _
6 }' \% g. f0 J: z
5 a. B; r# o: ]# H1 k2 b【 NO.4 使数组 K 递增的最少操作次数】0 _( q  v4 n: M, }. r( c
+ n, j, C# {6 I
解题思路
5 {+ U* K3 h1 v/ u& Y# p8 o2 h原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。' a9 B; k6 ]+ B* G" y
5 b1 b1 l, p2 X4 S
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。
: _) ]/ Z4 M$ V' b# I" b! r
0 u4 }' `+ o4 j% Z代码展示* h4 t& j0 ?  y" u# d0 e

: j, m& i' c* B! Y4 oclass Solution {, D4 e) g( Q# S/ F5 _
   public int kIncreasing(int[] arr, int k) {* A7 {# ^1 M! I  R
       int result = 0;- }$ t; N4 d0 I7 i( u7 T
       for (int i = 0; i < k; i++) {2 n8 g& ]  b% W& O$ C
           List<Integer> list = new ArrayList<>();
$ b9 Z% \) j" o! j6 ~+ ^3 ^3 q           for (int j = i; j < arr.length; j += k) {/ v% K+ y- |2 p
               list.add(arr[j]);
1 Q- Y$ [8 L) g' t& z# Q( M; n          }# ]& T+ e5 Z2 X; W0 Q! }* @
           result += increasing(list);$ t" Q- P7 Q9 f7 P
      }
; [9 J( N: S# W/ P1 T& ^  M       return result;
) X- ^  J2 q* o( ?$ o+ f# X  }* X# ?/ u' O6 ?
% U7 s& e: z" W& F
   private int increasing(List<Integer> nums) {
, P# M3 ^6 G3 d  s. Q       // 将 nums 变成递增: |" J& K* E' W7 c8 i+ M* b
       // nlogn 求 LIS
5 P$ G* \  l$ P) X       int[] dp = new int[nums.size()];
3 L. G& l4 L) u3 z% n) m       int len = 0;
+ j4 r' E4 K# l0 _/ p4 v       for (int num : nums) {
8 x9 O6 A" s- ?! g- h- _           int l = 0, r = len;+ j2 @' I, p( v5 f9 t
           while (l < r) {
5 c" D4 g+ f1 l( }               int mid = (l + r) / 2;( K" ]2 \% G5 x$ |  {) c+ D# B
               if (dp[mid] <= num) { // 非严格递增,等于也可
& a9 ?1 }: D! K8 c' o& `) E                   l = mid + 1;
! g& o: T; N$ |& p              } else {' W% H4 h! O8 {$ \' z6 j- z
                   r = mid;
4 X' L  I, z+ M: q: F5 `: z0 ~              }
' d& \/ U2 Z$ Q2 ?0 }1 y$ `& V3 i( H          }
9 @$ K1 V$ v; c% A% B- T/ z  \           if (r >= len) {
$ l! w, m+ q9 Y9 N2 X               len++;
7 k" ^9 m0 h  w1 `          }
; Q1 d& L9 c" U, `8 H           dp[r] = num;
/ E6 z# N. x1 N6 m# R7 K7 `      }/ w* h- o; j  u( q

- F* J6 L  L" S( A$ G       return nums.size() - len;' i* B$ j& _) I  M# G3 I% G
  }
3 }7 D; b& U* Q( [}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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