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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】7 A8 v0 q  Z! K: _# l4 [

3 }2 g, R1 u5 P. i$ [解题思路
6 y- K2 P" E& u1 Z4 t3 X签到题,枚举即可。
- |5 \  R$ p/ {% ~  v1 S4 y/ E6 {! |2 f8 P& p, Q3 c0 j
代码展示! Z4 ~- Q+ e4 X; B
4 H, T7 _, p/ O, t6 A4 d
class Solution {5 h* e* P3 u' ?, w
   public int prefixCount(String[] words, String pref) {
& b1 d  @5 l/ S& l) b- s; \       int count = 0;# @" D1 v' P( S  x
       for (String word : words) {
+ Q) r3 |  G8 b' _           if (word.indexOf(pref) == 0) {
( ]* o" w* }1 k5 o9 A               count++;6 O8 `4 t. V. ~+ R/ |
          }' @4 F% P1 C; c2 j% n* p% D
      }/ T# i/ H% ?- o$ E( }7 i7 j/ q$ K
       return count;, ]4 X8 ^* U4 e9 \! E, R
  }' M! e+ V3 d  b6 J; L. R: t
}
5 U9 r4 a2 N( |1 d  |, a& C  K# d, s- h
9 V( C- Y% a4 r* g5 y
【 NO.2 使两字符串互为字母异位词的最少步骤数】" M  r+ }/ D/ D

: T% Y% o! Y; F+ `$ W解题思路% O% M, L& v8 e' N9 |* x9 x
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。: h. x" j* p0 F; Y0 X

# x* U& q5 _5 l, J# e" p! J代码展示
4 I# {1 [) ^0 Cclass Solution {
/ ?4 B# ^* ~- e) E! O3 V   public int minSteps(String s, String t) {
1 X3 e! T/ x% M7 Q) H       int[] countS = countLetters(s);( @/ Y# N; @( j6 m
       int[] countT = countLetters(t);: L0 l( l: M" p
       int result = 0;
( o0 s4 P1 J* x4 @       for (int i = 0; i < 26; i++) {( W, i/ y9 B( R" ]6 f' _" g- W
           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
/ x" z) G" D; I' ]7 Y- V& |      }
0 \1 e$ A. n& }/ f! A       return result;
: g! y. ~, y7 r/ l, ^  }
9 c' e$ c3 _, R' O
2 j. l2 G' W; }. A! E   private int[] countLetters(String s) {
5 V/ {# w7 a% B; D. W0 B5 B. D       int[] count = new int[26];: f# B# j- |1 R3 R
       for (int i = 0; i < s.length(); i++) {+ D$ w9 Q6 ^6 k( p0 _
           count[s.charAt(i) - 'a']++;
- C2 e0 w1 m3 R      }7 \9 Y! p, `( `) ^' }
       return count;7 z( {- F4 P. g8 N" K
  }! ~  L# K8 F: v$ Q9 Q
}
& Y2 A- O) x. v& P  m4 t. P
" P7 `$ }$ a2 `- F  o: N1 c) ^' r1 e7 Q' O+ ]$ `5 {
【 NO.3 完成旅途的最少时间】# Y& @0 L3 P5 {' u

9 t( F/ \4 i# B5 X解题思路
0 f  X% U2 [5 w! c: n2 \6 ?8 i典型的二分答案题目。$ M* J: c! B* c  \" D% N9 {; \. K2 h

+ x0 r& ]! V+ O3 B代码展示* V5 U1 N+ N6 y. E; s$ J+ L: X4 S
class Solution {+ o2 l* I0 f) \% J+ u' m# G5 U8 e
   public long minimumTime(int[] time, int totalTrips) {$ J" z* {# n8 d, A
       long left = 0, right = (long) 1e14;* S4 K$ Q, D) o8 l0 J2 h
       while (left + 1 < right) {
) x* Y1 S4 G0 @; x3 P; k           long mid = (left + right) / 2;" x' Z7 t3 N! p, Z. q; i. [
           if (check(mid, time, totalTrips)) {4 E' k& |( V4 H* o" |+ Q( ?& h, R
               right = mid;) g2 {: @6 N$ T
          } else {5 F; w8 H4 z$ F" c9 \; ~
               left = mid;" F. N/ _2 \: _" ]$ v
          }
+ y0 W5 ?/ G2 j7 P      }
' {3 m5 V' ^: e       return check(left, time, totalTrips) ? left : right;5 O% }, f( _/ x/ w5 A5 w8 e7 P
  }$ l0 K8 _8 J, l; _7 G
- v8 B4 s1 g/ ^+ K
   private boolean check(long limit, int[] time, long totalTrips) {
& u6 g5 p+ r: l       for (int t : time) {
9 q) B4 V# h$ t& k. N& B1 j( ~           totalTrips -= limit / t;7 ~3 H# \" I0 t( T9 H8 v8 Z
      }
2 m% V, f) o  q% G. `: m2 g' c       return totalTrips <= 0;+ Q  z' F, o/ x, `, N
  }
6 W7 k; P" M2 ?+ ]6 |2 o}
% \( F' \& x* T  \; u$ c7 W3 |5 E- w/ n/ A
【 NO.4 完成比赛的最少时间】
5 X' J. p4 O7 F. w/ E- j! R# u) `/ `! q
解题思路
6 V" `% L2 q  U动态规划问题。
9 y! T! F+ X. z! h' L4 J( ]2 N) S) x8 n9 l! H* x
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。+ x, N$ X% O* e3 y4 f1 G. H
* z1 x  y; W6 ^7 R/ f1 U3 \
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
) n1 H1 M) O' y% K% c! U. g  R
0 C5 @  [" F6 e' B9 j* f注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。- O5 `) v0 F' y# z  D
  e# G/ X5 B' r2 C6 @
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。. L0 `: d* m# v* h1 B
) @% A# Y  b- c5 _/ f
代码展示9 I/ B  g  d7 ~& A# f) E
class Solution {( c- t4 i0 U4 q$ s) m
   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {, b; J. U+ a! h0 K7 A
       // g[i] 表示不换轮胎完成 i 圈的最短时间! P% o# V; T0 N4 H* B* F5 B
       long[] g = new long[numLaps + 1];
! {6 x5 Y4 [8 s3 j/ Q       Arrays.fill(g, Long.MAX_VALUE);
8 S' K; m/ @2 V$ ~( s1 M       for (int[] t : tires) {
2 m- V' s& p1 D/ t           long pn = 1, sum = t[0];; A# i# j, z$ _
           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {
( g- {- r! s+ X0 }0 k' v               g[i] = Math.min(g[i], sum);
9 X$ F6 P' _. I% m: w               pn *= t[1];+ Y$ Q  m2 e- y
               sum += t[0] * pn;$ h% k- B% v5 T2 t2 z6 a
          }
7 x. D) i" B0 p3 L      }
4 {! l+ b9 [! v5 e- t
$ b( f  [. L6 F       // f[i] 表示完成 i 圈的最短时间. a6 z8 ~' [/ H0 U8 M+ |
       long[] f = new long[numLaps + 1];
3 V/ P( |8 |" k' [8 P1 ^       Arrays.fill(f, Integer.MAX_VALUE);
% m5 _/ ]: Z+ s# U1 k! t. c3 w       f[0] = 0;1 @; r& r2 _# \- U! ~' c4 M
       for (int i = 1; i <= numLaps; i++) {
0 ^( b# C, [1 u* H7 _           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
% w9 O/ H( E" o7 Y% h9 \# f               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
0 \8 ?; f+ y0 W5 e; a          }
8 [- g8 d$ |. N/ I3 l8 F$ l      }
' ^& d- X: N6 d% t/ V       return (int) (f[numLaps] - changeTime);
/ }! {. J# P9 ^' }$ d9 Z* |  }6 l& C$ E' C& M/ W; G+ A' C2 e& k+ j
}. k! X+ x( K2 p8 |
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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