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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的第一个回文字符串】' i$ x3 i5 k1 O/ \, {
; |2 W+ a% C! _! I3 H4 D8 j
解题思路9 j' }8 G8 j1 H4 \: g' f5 h6 j
签到题,遍历一次即可。9 f( a% _1 e) N- d+ U" ~. M. ~- W
) w/ v; j, F8 j, b/ A
代码展示
1 l+ a8 J" X8 T/ U6 ]4 G* y" t* W1 ~2 v9 ~' \: u! r3 ]. {
class Solution {+ G8 ?3 }$ `8 {2 a; e
   public String firstPalindrome(String[] words) {% x0 _* l5 C8 p  w) G3 \" r7 l8 c8 D
       for (var w : words) {. Q/ s, l/ F- N+ `5 f- B' l7 g
           boolean found = true;' k1 A* Z! ~3 M  k$ d! `/ p
           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {* A6 J4 \2 C9 q2 y. {
               if (w.charAt(i) != w.charAt(j)) {$ p4 o; _8 x% m; Q
                   found = false;
! }7 f4 _: l* W9 N6 m# c" F                   break;5 `8 V+ d* `# R8 K
              }) R' o/ Z) O. B7 t( T7 ?7 s2 K! M, X
          }
+ }! }6 I2 N, d4 s+ l           if (found) {
+ H: G3 @  ~8 p& ]( d) ~0 ?6 W; R               return w;3 G! c8 P  @) ^6 X% t
          }8 d3 q2 L9 D$ Q$ o1 @" Z; j- E/ w
      }
9 f- q+ ?1 [! P6 x- n- C4 b) I9 D       return "";2 g" c( t$ K: w4 ^
  }
2 C; q; @3 \6 k9 S3 {) f}
6 z) ^( O9 h; B" w1 C, x2 |5 z2 F0 L& A) I5 ~

8 F2 b4 Q" A# z6 A$ s+ D【 NO.2 向字符串添加空格】
; |; c  R4 e+ Q; c/ ?
( P6 M9 D+ K; ]9 ^% R+ r解题思路
2 ~& A! T( Q  U! q4 H& u+ t4 R# T使用一个 StringBuilder 维护新的字符串。
6 {* N# p! G1 E4 G' Y' d5 z1 s1 @! m
' ?7 i4 p; y" {, T8 R8 n" G& w0 [, x; \代码展示
0 K/ h- r8 Y9 k  ^# o
- }1 a& e2 I/ W* |; Uclass Solution {
& }! l6 D3 S7 B$ p$ I   public String addSpaces(String s, int[] spaces) {8 Z9 U- D4 ?- a3 d4 D
       StringBuilder sb = new StringBuilder();* {, A$ \$ G* N
       int sp = 0;# r0 }6 a! C6 c% E
       for (int i = 0; i < s.length(); i++) {* W) P6 L. D) N2 b6 c
           if (sp < spaces.length && i == spaces[sp]) {+ \' i5 n3 w- L: n
               sp++;; A  I# K. T9 N$ s
               sb.append(' ');4 y  D8 d2 P' ~: ?4 n; ^' m! F2 \* u
          }3 _# A+ F, `6 X& l2 v& T
           sb.append(s.charAt(i));0 \; Z: \; h% Y& x2 P6 ~: e$ e! x0 N5 t
      }
. |5 k0 Q# E* T! g       return sb.toString();8 m+ M9 Q% j1 {: w( @
  }5 l8 ~; @( p$ V7 F3 X+ e
}
" k7 i7 B8 H2 X& @4 h/ l  {# y* w3 X3 l8 N* V  R
* k+ |! o$ e, c: r4 q* l
【 NO.3 向字符串添加空格】# j3 V+ J+ J" x  G

  w" N: S8 _! n$ r1 T解题思路
6 C7 F7 b2 [, T8 ~双指针。
0 c, ~; I# n5 K4 S; Q# d/ H; Q
4 O' s6 C3 R0 A代码展示
. v3 ]' J+ N% t2 n- j' x+ f5 _. c6 H; |" x' u6 r7 m
class Solution {: _5 o2 e: Q& ?% E% T
   public long getDescentPeriods(int[] prices) {+ _5 t$ s' j  D2 r  O
       long result = 0;
" W  Z- j. D. N7 G# s       for (int i = 0, j = 0; i < prices.length; i++) {
) E  V4 {& U& t+ B           if (i > 0 && prices[i] != prices[i - 1] - 1) {
( D' g9 i2 i* ?) m1 M' k- F               j = i;0 g2 Z" F' j& r& l2 S; T
          }: G. b" q& E: E# S$ u  y0 a( E+ g
           // [j, i] 是一个平滑下跌阶段" O$ F* Q* M( t. t
           result += i - j + 1;' G8 m* w! f/ G* y
      }: g* G5 W& i% V7 g- X, o
       return result;0 N* O! @1 q- u8 C5 n
  }' Q" X& z: n& O. ?! K
}
1 C' k9 X. t9 V% v0 G
/ u7 `  v8 j" ]. p% i$ H- Z* y$ z+ g$ ~
【 NO.4 使数组 K 递增的最少操作次数】
9 ]# }8 B# j6 T% a0 ~
, S+ F; s1 }) o: W) t& V- [解题思路8 X( u8 x9 _: b6 i4 J& |9 U* b( d1 a
原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。; u# z) i3 ^2 s4 ]: H

: Y0 v8 ~8 `) M7 I3 t6 m然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。8 H/ s, c1 z. w2 B+ Y, r6 ^# R
! M1 L+ a& n5 {- A" [; E+ @- F3 |
代码展示; [0 H0 a3 G$ ]: T* z3 @
' R. m7 W6 a2 r4 ^- V! @$ P, d
class Solution {
/ }  V! U+ s5 Q6 u/ |   public int kIncreasing(int[] arr, int k) {
& i- F8 F+ D3 ]0 X       int result = 0;' J* O- a+ k+ m5 u) O
       for (int i = 0; i < k; i++) {
: I2 b, l6 j: I6 z0 \: e           List<Integer> list = new ArrayList<>();
  W6 b8 ?% g& B" c           for (int j = i; j < arr.length; j += k) {
# e1 B% x/ {# n" ^  O               list.add(arr[j]);# Y7 W: y" G  {/ ^7 D) {
          }  T; P0 ?2 o$ A
           result += increasing(list);# J& q% Z& C% l& F+ z2 y7 E: p
      }) P$ j; D( g" R
       return result;, J0 x6 U6 ~0 o: H6 K4 X3 R
  }
1 m( y' t, z. q1 C; v+ n2 M7 I
% r; X0 C  s* v8 @2 [5 x   private int increasing(List<Integer> nums) {
, A4 Z4 F) O1 W/ M4 v& D       // 将 nums 变成递增
, A0 I; p! i& e% r' o1 Z       // nlogn 求 LIS
- p  o2 L4 k0 I& g6 N8 T/ g       int[] dp = new int[nums.size()];
2 C1 a8 ~/ N: U$ [. z0 l       int len = 0;& @: H8 e- x, y
       for (int num : nums) {, ~! X& P8 R1 j; d: h! I
           int l = 0, r = len;3 e7 c" e: ]1 `/ V( }0 }7 a
           while (l < r) {
7 c- I) U$ l7 P5 O4 J9 O  w' c               int mid = (l + r) / 2;  t7 l" a5 F# H2 m/ t4 G
               if (dp[mid] <= num) { // 非严格递增,等于也可; L- G1 ^1 I1 [+ Y3 k: \
                   l = mid + 1;8 @6 |) ~0 a* ^
              } else {% s; j6 @+ |! \- K
                   r = mid;
( h* a4 e$ `2 e- r7 }0 l$ c  i+ h              }$ o2 a; `! H# l, N/ |
          }
  |# Y! X( o- M7 `# N7 c  w           if (r >= len) {% w( W# \0 i; j2 m+ p- F8 y
               len++;
6 F  ?* U4 Y' O4 L2 }% d. w% U4 T& S          }- g: {+ z. m; O4 m2 }: v: G
           dp[r] = num;3 t# F; @% }0 I! F8 T" ]
      }
' v# l' V. ~$ w; G) S8 d% R7 W# W8 c, B7 a, o5 Q
       return nums.size() - len;% h1 I; ?0 _5 J% ~! E
  }. Z: Y9 e# }# y$ I- c2 k7 O6 p/ _
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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