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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】
4 k6 `: j* e, O, N  b' S0 `+ U. W- W: O; \2 T' f
解题思路# e7 A" I3 e: E# ?8 h8 d$ b
签到题,遍历一次即可。; O: n/ A  T$ k. l5 i5 C. j
+ m/ }, Q3 ^2 R1 J) V- ^( n3 ]- b, n
代码展示+ B; b1 H, o( {1 K" t

8 ]3 W9 E9 u* M* }+ m2 g2 {5 }" hclass Solution {
* j! s( z8 o2 n/ X/ Z2 `  d   public String firstPalindrome(String[] words) {% s6 Q4 J" \& h
       for (var w : words) {% g: Q/ E6 N. l6 f  I; C% m
           boolean found = true;
. n2 x$ E* H8 G! _           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {& a$ J5 t& k4 z* k% ~$ m! D1 k
               if (w.charAt(i) != w.charAt(j)) {
! b/ \+ a4 b# L                   found = false;0 V' F. s# g+ b# n' A1 h
                   break;) B6 h2 w) D* c; g& V! U) k. h
              }
6 k- H. @' ?( y& N7 Y2 G  f$ _          }
& V) e: v6 x# ]$ ?. L           if (found) {
6 p2 h0 M$ R1 {" w               return w;
1 x% F. e. f6 z% [/ U. u, j          }
' E1 }6 j# \6 J2 _' f# j% L      }  ]" u1 R8 m( G9 M
       return "";; n! f( a, g+ q2 l9 i4 Z: N. P, S
  }
5 L& V/ f" t- F- }: g. b6 K}- R' L; }' N/ J7 F/ h' x1 T8 [% ^6 `

+ r. d$ t6 D4 Q% u# F6 b. ~" s# C/ ~3 p) \' O+ x2 }' r. l
【 NO.2 向字符串添加空格】
( N1 G3 N8 k) t' u1 ?3 O* q8 o( m3 \- h' r7 `8 V: H
解题思路
6 b0 v1 D$ {) ^% |0 g9 Y使用一个 StringBuilder 维护新的字符串。
" t( m2 h# [) l$ p7 H/ r) `0 o5 @8 E* b: r& |
代码展示8 o2 ~6 R$ _4 N% }- f, m* H

5 E; h; s9 n# M7 H3 z; {class Solution {# z$ k4 y% V) y) B4 ^
   public String addSpaces(String s, int[] spaces) {) _4 T' ?6 \1 U# v  ?
       StringBuilder sb = new StringBuilder();
. n3 p' p' j' D+ o( s) u% ^# @" x       int sp = 0;
+ b) S; {0 @! k8 @2 C- A       for (int i = 0; i < s.length(); i++) {
7 A  n+ T6 Y/ }1 w  B4 S           if (sp < spaces.length && i == spaces[sp]) {
8 s/ A7 \- y; V9 C- \, J0 Y               sp++;" m# j9 U3 Z9 {9 S- E
               sb.append(' ');
: r- ^1 k" |  a; R2 k, U          }/ c: I( k, R7 E# C. ?+ D& A
           sb.append(s.charAt(i));1 y* t* |8 [! {" e
      }4 |  {2 x7 V  h# q" p( i; C  h
       return sb.toString();* G: [9 p8 m0 b( }5 ?/ T+ l
  }
+ C7 V' x) {; _/ |5 U- |3 i) i5 ]}
3 ?! z; r# f0 r3 _# G  U3 ^) t  k; e" ]1 ]

5 M3 c1 D, _$ A【 NO.3 向字符串添加空格】. [  Q$ t! j# g6 E3 x9 [

1 G& r  l0 x8 k1 c8 p' i解题思路
, b, p8 b4 Y2 o1 h双指针。
" J+ l9 N) w2 T9 ?0 i( t; a
1 @% D8 l- E, N  r2 y" e7 v2 C代码展示
) Z. r+ F  y+ y2 ^# c; ]6 ~  P8 W' Z7 E, n2 j- I
class Solution {
9 S& B. E8 W+ L3 {% |. h   public long getDescentPeriods(int[] prices) {0 k4 n! N. i0 w- L$ \* f6 q! L
       long result = 0;
1 E9 U& X! U+ M" R       for (int i = 0, j = 0; i < prices.length; i++) {2 O0 j  s! [( _
           if (i > 0 && prices[i] != prices[i - 1] - 1) {, e: r3 l# I* Y- q
               j = i;
1 K# ?, `$ F8 m. }# I          }
( L; W- r+ J; [& Z: I; e           // [j, i] 是一个平滑下跌阶段
: k3 B4 r# ^9 G& g5 q           result += i - j + 1;
) L7 r9 ]: @' Q      }
) R1 H: z! D+ j8 E3 }       return result;4 z4 K& G0 q3 b
  }6 s  _& w2 f( k+ D
}
7 ~$ K% i6 j4 E4 ]  @* r3 m/ B7 I% W4 A* _. |3 y2 V1 h

$ O0 ~# J! Z; f, d' b. {4 K0 h【 NO.4 使数组 K 递增的最少操作次数】4 u/ B; i# l3 o% n' m% j$ ^: s

9 B8 k$ l* U9 ^6 G) |8 _1 ~9 l解题思路
6 @+ a/ C8 C3 E+ I原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。
9 Y0 k" _1 n6 ]; k: B' p: @* ^; c! G5 r% L
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。
' P6 X& W& Z: V+ P% q+ R7 E
* m1 R& e  t0 m( w2 o2 q1 Z6 Z代码展示
! b% K9 ^3 ^, t+ l/ o+ {5 e1 n! T$ h4 p* `
class Solution {
7 z: j7 n) S6 x7 j0 {   public int kIncreasing(int[] arr, int k) {. y: V3 P  _9 H/ P' s/ D* o
       int result = 0;2 _  J) j- v) I3 L) I5 q9 I
       for (int i = 0; i < k; i++) {( C) I# _+ V: }0 W0 }  R# S
           List<Integer> list = new ArrayList<>();
' @2 ^. m5 f/ L           for (int j = i; j < arr.length; j += k) {- u  h0 X5 i  }; e! s- F
               list.add(arr[j]);
0 C! S0 C+ s* v+ w! l1 g* V7 e          }, a9 m1 V; |; w" p# c8 b5 S
           result += increasing(list);
* W. H/ P4 H; `( b      }
; ^" c6 }; m8 K       return result;5 A7 C1 Q" j( l" n6 J7 y% H
  }
8 v# E6 J% {3 l
, T+ U2 }7 o" S% K   private int increasing(List<Integer> nums) {, b' g# a. W6 `
       // 将 nums 变成递增
; G9 a+ M& _- @# b2 ~       // nlogn 求 LIS
$ f) Z& H! I1 p; E) o       int[] dp = new int[nums.size()];: }# z% q! T1 G6 Y" I
       int len = 0;. p9 H# _+ k  N9 l+ Q  w% r3 c
       for (int num : nums) {
9 w0 w0 w/ @8 j# @3 f$ w) W           int l = 0, r = len;
8 s7 F$ w1 v% s( H5 H           while (l < r) {  o$ C# m7 D7 S+ I" ^7 N, \
               int mid = (l + r) / 2;" j: R8 f7 Y3 p3 S! V
               if (dp[mid] <= num) { // 非严格递增,等于也可$ I* i& E9 c* g3 \+ w5 e
                   l = mid + 1;
/ B5 O0 L( v- T3 Q4 S              } else {
& `% q* p. j9 N                   r = mid;
4 i! @9 h+ P$ H              }
7 X% s( n6 R8 w. j5 `& ?& Y9 X          }. d% Z  [% J- L7 a" U" H; U
           if (r >= len) {1 \$ g& H. I/ |$ Y' J; U
               len++;
2 ?& ?5 }! ?$ c* l$ I          }+ T& @2 _) s! A, [( U
           dp[r] = num;/ W9 C$ R. S3 b' Z, w3 a
      }8 ~4 u2 p, C% M; Z) w" c6 l# j! U$ {

# q1 f+ S$ E$ n       return nums.size() - len;
: }) G8 y6 j! f  }1 @& Q- ], Z0 H) E
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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