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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】8 l) n, N- \3 h/ E1 t" v) _

0 c+ |( b6 ]9 d9 q- N8 G! t解题思路0 M0 S, c8 F5 L0 t
签到题,枚举即可。
) M. x, J. j- y1 _) a/ H: N* w+ C7 P$ I( B& ^! l
代码展示
+ {. r8 N: C; `/ a- z1 }
( s: k: Y& R2 b7 r0 eclass Solution {
8 H1 l6 ^1 Z  }# L$ o* }" q1 i   public int prefixCount(String[] words, String pref) {
2 t6 k# A5 o) n' @+ \8 q6 K5 \. v       int count = 0;) F3 ^3 M, l+ V; F1 A/ P
       for (String word : words) {
! M6 o' S! U- O8 E) x) o           if (word.indexOf(pref) == 0) {6 A$ Z# E/ c0 _7 S
               count++;& U# k, }1 Z$ n" G4 z
          }
5 t# U1 w4 N1 f0 R( ]5 j  L      }
& V: e, `  a! p4 I2 B+ e( I       return count;7 N9 V2 P: y: h1 Z( h. a# e
  }1 E" s; p) b& s/ C: O8 z4 I* z2 u' d5 S9 {
}& ^3 t% t& b9 R3 v: U0 r+ z6 u
  t* W7 M' o% k
8 p7 A# \8 O& S- O+ p& V& ^/ E) I
【 NO.2 使两字符串互为字母异位词的最少步骤数】
; ?2 S) x* d- P, n
, P5 g) `$ S3 J& l+ p* c% U' }( ^0 Z解题思路
4 Q9 y7 t3 P( d' Z8 @/ g字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
' f' i8 t; [1 ^& B
# y% I( M. U5 X代码展示
  ^1 m" l: K; @/ l( Y+ Z( oclass Solution {
8 b/ E# L0 ^) h9 Z; z6 z   public int minSteps(String s, String t) {
1 t" b% Z: K, |4 H1 q. m7 |       int[] countS = countLetters(s);. `/ x3 z* K* p! V5 D+ N7 L# p
       int[] countT = countLetters(t);
% o- s! t% |' z       int result = 0;
" `+ \" r+ _/ Z& Q+ N       for (int i = 0; i < 26; i++) {$ Q# H/ T! _# \8 V! x9 y4 Y1 d
           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
9 ^9 {+ t8 o) X5 H      }
5 Q, Y* r' n; o* H5 @# s       return result;
  w& p% c6 X: [+ t! h+ U  }
% M- U( ?, @6 N
0 u7 l4 ^# v6 [/ J  ]# _7 b   private int[] countLetters(String s) {
6 v0 n1 M8 d8 B- R& h       int[] count = new int[26];6 }( G: g0 Y( G- u
       for (int i = 0; i < s.length(); i++) {0 ^( o9 v5 w+ r4 N* f
           count[s.charAt(i) - 'a']++;
/ f* y$ w( y* {8 z3 A* W6 @* @      }
  a" ~, z: X# Z& J4 Z6 U1 @       return count;  N' x" u  n8 b
  }
; r6 W) j2 K5 F# t) E. t( o}
; ^# v" U+ j; c3 @3 \4 m, `
8 n7 D- K* x( f
* M0 f) B* Q/ h1 S【 NO.3 完成旅途的最少时间】
# R+ ^- X9 e: \# A
  W! }3 m0 i" i# l4 o8 T解题思路
" H- S6 c+ J9 h# \; q典型的二分答案题目。
5 c# L; M8 ^& q, B/ z' y* Z+ H1 e- i4 g) Y; ^/ J
代码展示  Y" i0 L. A* ]2 |
class Solution {
* x( c6 G( `& T) o   public long minimumTime(int[] time, int totalTrips) {4 J0 D# ~8 `" ]
       long left = 0, right = (long) 1e14;3 _) P" H; _  D7 ]" j
       while (left + 1 < right) {, k# J) ]; i# e( K( D. q
           long mid = (left + right) / 2;, o1 {9 I" r5 h8 v
           if (check(mid, time, totalTrips)) {
8 M$ R" |5 c% P, `7 ]1 o               right = mid;, g: s1 g  l$ J( K
          } else {. e9 J' N* A+ {* S9 h2 y6 b
               left = mid;( X" }# j* X& L9 g- m; Q
          }' _- h' Z/ B" G4 _9 W9 J! q
      }
+ Q5 d% x. X. y. O! ^       return check(left, time, totalTrips) ? left : right;$ X+ l: O/ U; G) D) F; l) M
  }- ]$ |: o: }- {0 q

3 h7 N/ V7 I! L- Z1 V' j   private boolean check(long limit, int[] time, long totalTrips) {
% h. Z: e1 v- R4 @, V5 `% n4 w       for (int t : time) {4 l9 ?4 t, t* B: m! X* l6 \$ j
           totalTrips -= limit / t;- C: i/ o5 U/ W% N! s6 Q2 Y/ c
      }- p; G( C" g& |" l# i. u
       return totalTrips <= 0;5 @2 \. B( v' [- F' x
  }
" o( R# ]) F7 N% ^3 M* H3 S4 \% }8 e}1 v& v$ E; e$ B7 d' }

% N/ x3 c1 V+ S6 O3 v0 b9 _6 g【 NO.4 完成比赛的最少时间】
: W/ |$ X- O0 h4 ~, h- J- \' J! O, A0 m% L
解题思路- K9 a/ \, V6 d$ D1 J9 O
动态规划问题。
$ ?  A, [, {9 }0 c# t8 [+ {9 ~6 @. o$ g6 n1 I" q7 u
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。5 g5 q: o7 A9 E3 P

" ~4 p; g8 y' ^( p, J* g然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }4 v" o$ A/ X/ x  ^) S

$ K9 q& Y- t5 [3 F1 m+ H' @注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。' o2 `; G/ v( e+ h- P5 c4 w8 G. g

; j' z- G, X8 c/ p# i6 w; W由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。& }$ c3 S2 ?# h; O* N9 f& Q

( ^5 w0 B4 t* E! W代码展示& r) V5 i# Q4 ~$ e5 W
class Solution {  o4 q+ D$ P" ]+ Z; r, u$ g
   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
& S6 B) ?- |+ a8 b* K0 [       // g[i] 表示不换轮胎完成 i 圈的最短时间
) N1 f& L% q  `' ]$ D$ q       long[] g = new long[numLaps + 1];+ N' R1 Y* C$ y7 s! v" F
       Arrays.fill(g, Long.MAX_VALUE);5 i) H+ b' R& k3 b7 T' @4 Q
       for (int[] t : tires) {0 j. F6 c9 T! ~6 R+ m5 V
           long pn = 1, sum = t[0];% [4 _" K# l  @" Z1 h5 ]9 f
           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {3 k! W3 V- R- f7 n1 f  X
               g[i] = Math.min(g[i], sum);
/ L2 k3 L: U. f0 N8 M, z+ y               pn *= t[1];
9 e7 l3 q( W& M* A) U6 @- `               sum += t[0] * pn;
! R( M3 N5 y9 _, H. N4 m7 H# G          }
* i8 }) u6 N, x  J5 p& v& v+ [      }
* E/ b" E! _& c+ K3 I5 @7 P! N$ R
3 @& c0 g8 N& {! C# S0 A       // f[i] 表示完成 i 圈的最短时间* Y. W: |* s" t8 d: q6 W9 o& R
       long[] f = new long[numLaps + 1];, M+ s0 `3 t* v
       Arrays.fill(f, Integer.MAX_VALUE);
& _! ~# p$ E+ j: n/ [' K       f[0] = 0;
* p# O' R0 O: q' ^  g       for (int i = 1; i <= numLaps; i++) {
  a; h, U, A3 l+ U) C) `% l3 |           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
5 O& R: g0 M4 x, W               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);3 B8 P+ ?3 P* x( }
          }
* v' \% k- M# u- k6 w3 z- t) Q      }0 t0 T  m0 n8 Y5 ~
       return (int) (f[numLaps] - changeTime);, a$ |# U4 j: c  Y# v
  }' a" j1 [) i' o
}
! {# B1 Q4 `, i& s( ~
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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