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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】
- a% T; ~( K9 I' h! M+ @4 F6 m& I/ n! B, }; N5 E5 h
解题思路
* b+ E$ j% q2 Q: w签到题,枚举即可。
6 L# R& i9 e- E, q  e: T6 ^
( m( z+ v2 u: I7 A  h. H( i代码展示: U1 @* ?6 e; @
7 A" r4 ^8 E+ k( s- y7 _: N1 y) s
class Solution {5 ]5 u, s& M' \; @5 ]9 q: u
   public int prefixCount(String[] words, String pref) {! A0 z7 R+ {, U4 X% @
       int count = 0;
& p  _. W2 R, g/ z: M% Q$ {       for (String word : words) {$ h/ s% |; ^4 e+ B9 r* b9 t
           if (word.indexOf(pref) == 0) {
3 D# p5 [) j. ]/ G6 B2 k               count++;7 Z3 |" `+ S8 ]4 b. t( U
          }
' F' @. d- g/ Q% [& ^+ E      }
, u. D4 P, x0 t. z+ A% d       return count;4 r& F! q4 T; r
  }
: e! J9 I9 G4 U5 A* v9 ?}, f3 D' ^; j3 L6 W5 m1 A% a. Y% n
: N: [! p6 I# I/ w4 ~6 ?# i' M  W( u

4 s0 y0 Y+ _, A1 w, h【 NO.2 使两字符串互为字母异位词的最少步骤数】
/ P# c. X. U7 z& o8 X0 P# {. _
解题思路( I  E" R! c8 W
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
2 T& r5 h2 p8 N5 _  R: s8 y8 o" L! j# ?% `9 P
代码展示8 E6 n$ n2 C5 q% U6 W/ s" {
class Solution {$ j; y9 S& j7 t8 n" p3 L9 |0 j& w
   public int minSteps(String s, String t) {
* i) r+ i- P! E: z1 |! k6 h& V       int[] countS = countLetters(s);
; x0 A$ }( C( D8 [9 E0 w       int[] countT = countLetters(t);
6 ~' ~9 x8 O# `$ W* j       int result = 0;  t: ?2 y/ F! y4 V, S/ {3 I
       for (int i = 0; i < 26; i++) {
3 t% b8 S' e: w3 U) F5 z           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
/ s' f" k$ P7 L      }
" x7 V9 W1 J  `4 T" i5 \       return result;3 |7 D; D/ g2 B7 y" [' O% O
  }
1 c4 |, J% F1 s% D4 C* y
" F6 L% V5 V6 ]* A, y+ p   private int[] countLetters(String s) {
- t) E0 N% z# r, |* p. A: N% M       int[] count = new int[26];: ~$ U- }: D$ m9 U" {1 O& F& l* Y
       for (int i = 0; i < s.length(); i++) {) i  l! ?/ t& t& }( z2 g4 t; G
           count[s.charAt(i) - 'a']++;
, T) l& R* U$ q  c      }1 |+ O4 Y  _& B2 X8 u
       return count;
, V( [+ R9 V. H  }$ |$ c; _! S. A7 G
}% Z. p8 `6 `+ M- i2 j5 ^
* C% @! N( T/ |# z8 P

# Y0 @" O$ v  w! i# M7 s【 NO.3 完成旅途的最少时间】+ E" |- E+ C' s$ X

; i) F. V9 v3 E* W/ L- x  o解题思路
, y+ P6 R8 |% ?典型的二分答案题目。
( }. w' R% s' ~* s0 F# a: O) j5 T$ j
代码展示
2 ^" x/ b/ H7 i/ l$ Pclass Solution {& ~' a1 }6 r+ j  i" W+ A4 {
   public long minimumTime(int[] time, int totalTrips) {- c! v9 P. d0 j9 z
       long left = 0, right = (long) 1e14;
( |, L) j: U8 y4 p8 ?+ I       while (left + 1 < right) {
, V/ b! P4 V* A, l2 f/ R           long mid = (left + right) / 2;, X9 R) c6 J) A) [0 j4 l. j
           if (check(mid, time, totalTrips)) {
% I  r5 K/ y1 |  y9 m) F$ Q               right = mid;0 U+ x2 U' K3 K% M; u
          } else {+ m! ]3 l! |4 J* r; I# n& ?  l
               left = mid;. G- C! V& Q/ g; Z% t
          }
* D5 q- w; Z5 h  I# P      }
$ n  \3 v3 v6 w) }1 D) h4 p7 c       return check(left, time, totalTrips) ? left : right;! Q4 {! A1 S  S& `/ e7 D" ?. V
  }9 Q! o# w' X" R4 u
  S, d8 {5 p' J( v
   private boolean check(long limit, int[] time, long totalTrips) {0 Y+ D+ M$ g% L0 y" x$ U+ a
       for (int t : time) {
  Z& P0 z. o. t: G# t9 f2 _           totalTrips -= limit / t;
! G/ B4 ^" f' v* `2 s( @( L      }
; }- V" c$ f6 j, m       return totalTrips <= 0;
. N4 P& s* M9 t/ b& Y: F; B  i  }
8 N* F( `# L8 T1 B% P4 S7 l3 A( R}
. A7 L/ z* U9 F. o7 T. |% W
& I$ n2 I9 ^$ F# u' H: `# _. [! y【 NO.4 完成比赛的最少时间】0 K. L* K+ |1 h
! G1 a8 X# w4 U& z
解题思路
5 m, A, t0 a! C( L2 A/ q6 \! ]1 H动态规划问题。  f* }8 [$ C9 \

2 A/ J/ {/ u+ m9 u' j7 r# Y7 y先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。" P+ x, k/ Q6 e( G7 _+ a2 A8 Q) K
3 {) p: I. e2 R
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
* U6 _9 k( h1 A, }8 Y
/ u: M. x! ]" t; g% n* F注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。  ~0 ]* |, k) f5 H3 X: l( H
! C; T( c# g5 I  C! ]" k, v4 ?, o
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
. y- J7 ]( r  S- k' L! D0 \& |* H  h" [: t+ @; g3 N' g# h
代码展示: B" C% r+ z) S. V
class Solution {
' e& ?' V: b. Q0 A$ }4 |   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {6 V; x) X6 j+ A$ }- P& e
       // g[i] 表示不换轮胎完成 i 圈的最短时间, g( N* [7 m4 R3 @1 c' I
       long[] g = new long[numLaps + 1];
# ?. K4 I" f" F# u       Arrays.fill(g, Long.MAX_VALUE);  v. P! s9 S. _. T. _. u) k
       for (int[] t : tires) {
" @3 u3 q1 t4 a5 `% ]8 i4 R           long pn = 1, sum = t[0];
. _8 S( T- j8 Y5 Z' W           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {
2 m2 L% E6 W/ J: e               g[i] = Math.min(g[i], sum);
2 p6 T( O4 K! O( f1 d0 R6 x, t, |               pn *= t[1];
! S- C4 ?( O  ], p2 F9 o               sum += t[0] * pn;2 e' [1 g' a0 ~- a
          }
0 e( U5 y  @0 q/ w* _$ V      }
  L& ~. [2 s( ?- H9 J- G
9 C7 i# D) V( j1 M2 V9 ?  w6 {       // f[i] 表示完成 i 圈的最短时间
( C8 q% `: ~/ r       long[] f = new long[numLaps + 1];
; A- R; k, O* N       Arrays.fill(f, Integer.MAX_VALUE);  @! S) O" k3 g; S. k" [5 T) @
       f[0] = 0;
$ x! U) k) @5 O  j# F! l       for (int i = 1; i <= numLaps; i++) {/ h% x4 [7 d* x4 q! q. c  |5 P
           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {1 ]  n. u7 K# q1 Y% ?) e
               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
8 O6 D" K1 Z8 g+ h3 l. B          }$ {0 {/ j6 j; j5 F# \/ r
      }
( i7 @- a7 D2 m6 Y$ d8 z4 T4 |: p2 G       return (int) (f[numLaps] - changeTime);# `6 W: D) h0 F' C7 y2 ^) ^9 f* W) @
  }
& E* e3 _) h& t+ t* D& j! f3 [}1 e  V9 c; U$ b( x' S( ?
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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