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

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

上岸算法 回复:0 | 查看:2632 | 发表于 2022-2-27 23:33:14 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】
! P; l  ^3 i3 p. B: F0 b; y4 o$ Q% m$ R: ?( L
解题思路
/ {4 p8 Z( ~4 I: A5 T3 N1 I签到题,枚举即可。
" E4 }: w4 y& r. }5 }% N+ v% D, W
代码展示
0 l. ?, E8 a; P3 `
4 [$ H+ h$ `0 g8 {class Solution {
- _. D, S% T; g   public int prefixCount(String[] words, String pref) {
8 G3 `% {  c, d, T6 _& M) E  ~       int count = 0;" }1 s  P/ {' c, N( z
       for (String word : words) {- s/ d/ P* D6 `+ q
           if (word.indexOf(pref) == 0) {. E# |& h2 m4 a8 X: [5 g
               count++;
$ t2 p$ N* ~* h          }+ T( J# h- B; [) w; T
      }
) w" A, H$ L* s+ X# }) b       return count;" @6 p; O  \6 ?. [* h1 }6 l
  }
+ V6 m6 P, |* d: ]# S}
) b# Y: X" _& o7 ~8 _/ I6 Z+ N+ L& J2 \
9 z6 K- Q6 P  U4 n( {0 l* D
【 NO.2 使两字符串互为字母异位词的最少步骤数】' ]* v& ~# F" ~, u: p1 ]
( @4 j/ h! j; C, _. c! L# {9 x& J# b
解题思路
& j2 V: I5 |! C8 z4 i1 `6 G字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
/ G: n) y% H! o* f8 e- A" h8 i
+ c- |, C% X. q  S) Q4 T% q代码展示
! ?! h# V$ B/ v: m) j/ Eclass Solution {
+ ^4 D7 D; u3 l* t' I   public int minSteps(String s, String t) {
* U! G) Y5 I6 G       int[] countS = countLetters(s);  {5 D/ K: [& ]1 M' R3 N. L1 G0 n
       int[] countT = countLetters(t);
: A8 X( @# p  O: i       int result = 0;
) |- ?$ d6 Q$ ?/ v* A& o       for (int i = 0; i < 26; i++) {
7 i/ L$ M/ M) \1 \           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
" p- _  m6 r3 y( \; w8 D0 w5 r      }
" C+ [+ p0 Z6 ]       return result;
; x- e" P- |& z  }
( S  j% V2 @7 l& A
3 Y: d4 L7 n0 n9 K   private int[] countLetters(String s) {
+ M6 R: i  [, B  Y9 t& [       int[] count = new int[26];3 I/ g2 d0 e) R; b0 f5 q4 f. F/ G! k
       for (int i = 0; i < s.length(); i++) {
" h8 S# S0 K" u( R* i. k) j( S           count[s.charAt(i) - 'a']++;
/ g$ y4 J2 Y" ^$ U+ c' f1 l      }
5 ^. w7 `$ B9 A- D8 B2 ?7 \       return count;) P5 s& G  f. a; d- V# f
  }
; [2 a. g& s. u}! k( h( @7 `) r; l! L0 C

6 O- X$ k/ W. Y* J, q! X! j7 v3 `1 c8 F% k8 l4 o& J9 _( d
【 NO.3 完成旅途的最少时间】2 B2 U9 Z; w1 f" G% i
, b" I* h! S7 b/ ]' `  _9 q
解题思路* V& Q  @  D9 m9 l5 N; `0 ^
典型的二分答案题目。$ v# P8 H& X& G# `, T0 d

! j0 |, Q! G+ t代码展示
) ~! |9 x; K, f, Xclass Solution {
' R2 L+ C2 s1 ~1 k# ?   public long minimumTime(int[] time, int totalTrips) {
6 B% G! z* X* N2 ~' ^       long left = 0, right = (long) 1e14;: N; W/ h" E; \4 i' C: G
       while (left + 1 < right) {9 P# @" ~' A9 _; V
           long mid = (left + right) / 2;5 ~3 y  C0 s8 f( ?
           if (check(mid, time, totalTrips)) {0 y0 J% Y0 c: O9 M1 ?9 r5 b
               right = mid;+ [' u  l2 J* s- r% P
          } else {, x/ q# f7 K- k0 V
               left = mid;# Y! i8 `" j0 J( r/ w" A$ @
          }
5 ~* B( l) O! c      }
3 |. F# q  y, h9 m       return check(left, time, totalTrips) ? left : right;6 v5 L" ]# t" }: T6 l% _( _
  }  ]* A; u$ h5 S

& E+ k; L5 K2 Y: h   private boolean check(long limit, int[] time, long totalTrips) {
! j* `) S+ ^! t* g$ B9 f) S       for (int t : time) {: T* k) _# T! Q7 ^& U4 |
           totalTrips -= limit / t;9 [0 J. c3 t1 r0 P& H: Y+ X" y
      }  U6 n3 j& I, M% y6 ?
       return totalTrips <= 0;
( f- U% K: e9 d1 w  F% ]6 |  }8 @' t% g1 e" w/ G- _
}$ o. T2 V4 B6 w' W3 z5 z9 [

, }7 E) s$ y" ?6 Z0 _0 h. `# s【 NO.4 完成比赛的最少时间】
4 T2 L3 b$ O0 K
3 b: d1 U0 _+ m解题思路
) y4 u) R) @  u7 j% ?/ D$ Q动态规划问题。/ C7 H& V1 D+ h9 {' S7 `- q

& R0 |. q! N( i: w先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
* N! K( M' d+ O6 j$ V$ I. ]# E% p, c2 p8 G& s) s
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }8 c& ]" l- I/ m
+ E$ ?( u! d: h2 y0 w7 J# f
注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
: Y1 u  j4 k4 Q7 q6 j& Q
( k6 Z7 o+ x3 Q* `1 k由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
: W) o3 C) z9 Z( L
, r4 I6 h  \* g5 D  {6 m- q代码展示
; k% x/ d1 ~) }9 L- t+ pclass Solution {
3 g/ l. }5 s. r' t% B! ~   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
4 R% x, J" Z8 M8 I8 V       // g[i] 表示不换轮胎完成 i 圈的最短时间
. X/ I9 J. `$ l; M' S$ O, Y* x       long[] g = new long[numLaps + 1];0 f# j# b/ G* {$ H3 _. k
       Arrays.fill(g, Long.MAX_VALUE);" u' M8 b7 h0 E9 q" y# Q
       for (int[] t : tires) {1 T+ K0 M+ h3 L7 S* k" z1 y" f/ R
           long pn = 1, sum = t[0];* q4 K6 I9 D5 n: x
           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {0 @" \5 I! N8 s
               g[i] = Math.min(g[i], sum);( A4 f+ }7 I! P7 J" r% [: n. N
               pn *= t[1];$ w" u4 I' y% e- [; u
               sum += t[0] * pn;) W. Q2 l# S3 @( J
          }
  K  l3 r7 l) q# i6 m( K; M      }% `6 W$ `8 `8 Q( X& {- i

: N' w3 l* q6 }' K& V  }       // f[i] 表示完成 i 圈的最短时间
& q0 j3 e+ H: _       long[] f = new long[numLaps + 1];4 s; x/ T' u! g& K4 e4 C" f
       Arrays.fill(f, Integer.MAX_VALUE);7 o) b0 l$ @- s4 @9 ]
       f[0] = 0;3 ~- k" Z2 ^) j
       for (int i = 1; i <= numLaps; i++) {
/ r- E2 Q( U9 l$ I& a9 }           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {- N6 f% z% K- A4 v/ t
               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
6 E, G1 W8 x3 S- k          }
3 D& O5 f* Z! S3 Y      }
) `9 k! t' q6 B# {" q( m) ^       return (int) (f[numLaps] - changeTime);
7 }! c# h* u# i' p  }, E4 R. N) W& X% K' o. C
}0 o4 i) K7 x6 b7 U. r; r
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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