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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】
" K! p* L# E+ k( Q& Q8 r
+ K+ A$ J, g3 e: q6 i解题思路8 u+ o$ I7 v; y/ W: [- F, ]
签到题,遍历一次即可。2 V) R+ E/ P! U
. G5 l) S: }  W3 c
代码展示9 `. n2 I; x9 X1 W% K

* _! ]' V4 \9 m: g1 S' O0 X* ~0 x: Sclass Solution {/ @! j' P: D4 ~" @1 |
   public String firstPalindrome(String[] words) {" p( k! u# }6 b+ s5 X7 e0 v
       for (var w : words) {
: F" e" U5 B3 t% @* i           boolean found = true;
2 @, k) W$ _% g# n           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {9 U# f) p0 p! i6 k7 y( E; A% b0 U
               if (w.charAt(i) != w.charAt(j)) {
4 b0 f/ |2 f) Y- s: i                   found = false;
6 n6 z7 C' ]+ u& K                   break;
- O; M+ M; H' p6 H& g  A              }
4 Z4 ~6 G6 T& H# Z+ d& o7 m. s          }% Q7 S. Y8 Q9 L6 u! j3 A* f& S' H
           if (found) {0 @$ v% I4 m; \
               return w;: u5 N4 D8 B% c1 ?
          }4 ^( ]) n9 K. ]* }; D/ L* w5 {% l! g
      }
, T/ |' C) T6 r, U0 H( q1 R       return "";
8 Z9 F0 S8 l/ \  }9 I2 k6 d" I2 g7 w- x
}
" o; D, x$ }& C  U8 f0 q  a: P* o! F

. R$ d& l* f/ D7 P# X【 NO.2 向字符串添加空格】
; L) I5 b/ t- S1 v0 x# y; W1 K/ A9 A' m* s2 R" |+ k( P$ w7 D
解题思路
( ^8 O/ g6 Q. D: b. E$ Q使用一个 StringBuilder 维护新的字符串。- Z" S, V1 J; X
% s% i+ Q" p/ b! s! K. e% J
代码展示+ C8 r% ~% R" B
- R3 k2 t+ v2 K4 H
class Solution {
$ L- l* N1 N: g! c) c. L6 }7 \/ e   public String addSpaces(String s, int[] spaces) {6 Y2 P  J! {+ Z3 ?) g
       StringBuilder sb = new StringBuilder();2 @& }8 K; N0 y9 X
       int sp = 0;3 D; P* T9 \% R( n' R2 Y: j7 b* J4 s
       for (int i = 0; i < s.length(); i++) {
  u/ E, x. r7 \# @' R           if (sp < spaces.length && i == spaces[sp]) {
& y) A3 [( \0 X2 s$ t               sp++;* P1 _) {- ]. o* Z& x, ^
               sb.append(' ');8 R5 C, V/ \# L. `/ r$ i
          }
# r6 B; n' T5 q6 W( `+ e           sb.append(s.charAt(i));5 K! i( ]6 X! D: H
      }
/ M3 E" K7 L% `- D0 N" t4 Q       return sb.toString();
* h" T7 k0 d# i1 V& ?4 X  }- c8 b+ e2 i" s
}
* Z1 I! G, a* e: F- K! N# l4 f$ B% u* R6 N3 t& _7 A* S
8 c5 C/ y6 Q! |1 i# g
【 NO.3 向字符串添加空格】( d0 k* a: V! |, G
3 ~3 K1 F; e3 Q/ L
解题思路# S: ]! e0 @# t+ x! \4 X9 ~+ u0 [/ H; _
双指针。
: A6 s9 M/ B$ k9 O' o$ @0 Y) _" Q
9 S5 W5 G9 I7 p7 L% M& O$ l代码展示) k. C$ g' A) a  J+ k

( Y0 M$ a# _5 @8 E9 F6 C' mclass Solution {
6 O, G( Z( l7 Z& z, h- G% e   public long getDescentPeriods(int[] prices) {
5 ^0 Q/ @4 J# c! K       long result = 0;
+ Z: y7 u% ]7 s0 D0 h       for (int i = 0, j = 0; i < prices.length; i++) {
* p" t% @4 o/ {" J# u           if (i > 0 && prices[i] != prices[i - 1] - 1) {
, Y+ Z; T" C* y- n0 W- j$ v               j = i;& Q1 F0 e( W  g3 q
          }
* i8 o* s% c; S8 g- w) S& n6 J           // [j, i] 是一个平滑下跌阶段
: C8 W- W2 [; t( v) n5 P           result += i - j + 1;
9 n) E( }) ^" i/ |7 Y, Z      }! }$ b+ q/ Q) R7 j
       return result;
: v0 Q$ `$ ]3 s  M  }& Y4 I& V& d& E) Y. ]
}2 E! J. L9 B: V; }/ I  ~9 y. V
7 }! W5 h5 S9 L6 n" [9 D' a: d

) ~8 G3 Q8 ]! i" s( j' f【 NO.4 使数组 K 递增的最少操作次数】
. H% _# W2 t# L% @' e  q3 |+ g4 i& {0 n- ~: q8 |- n
解题思路
) w' m% Q( l) n! a& ?% t原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。, x* n, H  f2 [
( a# X# x7 v( X, ^
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。
( P. S" s, ]) e' k* B
: X  N0 a, x, K  }9 R: a! m( ~+ h代码展示
: t+ n0 y/ f( Z4 E' U7 _$ Z# A9 |8 Y/ z7 y
class Solution {3 E4 N' w9 ~1 O2 _! i( D, c7 z. ?8 y0 `
   public int kIncreasing(int[] arr, int k) {, e% r3 W# e* d6 n
       int result = 0;
, j' [$ A, P& R# P% r       for (int i = 0; i < k; i++) {
) W& `, u6 C% W8 [: d- _2 O           List<Integer> list = new ArrayList<>();1 C6 D; ^  e, i
           for (int j = i; j < arr.length; j += k) {
$ H/ z* j! ~& {2 R  f% G* W               list.add(arr[j]);. J; P6 e( T. C& H. |
          }
( |- A9 H* [5 u& ^) e           result += increasing(list);
) }4 P% q. P7 E+ t! b' r5 h      }: P  O  G/ `" o9 b5 Y. C% @, ^
       return result;
7 l0 _. L* _& b1 {* M" J! u0 c  }$ v- D, ^; _# g
  E% O  \* Z" `. \" c
   private int increasing(List<Integer> nums) {
/ g$ n3 e) k% b, ?; ~       // 将 nums 变成递增
& w1 `) h8 |5 C6 Y9 Q       // nlogn 求 LIS1 k8 d3 M4 ^) s6 I% L
       int[] dp = new int[nums.size()];
$ p' z0 g+ a6 m7 E, l       int len = 0;& W0 Q3 |& C* U  o# e$ B
       for (int num : nums) {
% w! g; I3 `' q0 ^+ G           int l = 0, r = len;
. u. `$ m- v3 i. h2 D           while (l < r) {
4 k" {- K9 j6 L5 b8 }               int mid = (l + r) / 2;
  f/ S8 |1 Y3 `/ S               if (dp[mid] <= num) { // 非严格递增,等于也可
$ A: |4 w" Z1 Z+ a0 ^: X                   l = mid + 1;
8 o1 d2 A2 ~& i, g& N% H9 X              } else {2 Y0 E' {7 u! l. s; h: i2 V( K/ O
                   r = mid;
- ]. H- u9 T$ h              }
9 K/ N# W( s2 j9 @          }
2 w* @9 G( W& t$ M# w  H1 p           if (r >= len) {4 G  y* d! B& A
               len++;* f* B0 \1 }( Y% _" |- F  K: u" X
          }6 x$ {, d4 f4 i, }  _. B/ \
           dp[r] = num;
  g9 g% P& l) y4 u  Z2 y* b% q0 o      }
, o1 q$ Q3 m; N  M* y5 U
: T5 }- D* u" }5 F       return nums.size() - len;
' E# F6 f$ b; P8 X  }
( w" y, r  S# @}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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