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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】
* o; i' M$ O' B) e' x- t. r7 ^8 W0 b! K) k- F! g
解题思路
" F+ X+ p( Q. V签到题,枚举即可。1 C! h; l# y. B& |8 P
; ^6 H% h9 O! n* j5 R2 h& B
代码展示9 P" V3 P, Y; g0 q# W
3 p- l1 B$ y% s! S. @' [3 k
class Solution {
9 s; l/ R: Q7 P" B% m, Z   public int prefixCount(String[] words, String pref) {
6 `5 `& E" D9 w0 j3 E( j' \" e       int count = 0;( y$ }  ]  j/ M) j
       for (String word : words) {
8 y1 ?+ ^  f# f, K% m           if (word.indexOf(pref) == 0) {
1 y4 z' U5 a) w               count++;
& A9 m* W) J5 e. c: E          }7 I( D4 N+ n) |1 N: q* R5 C, m
      }
; m1 w1 L9 n0 m! o       return count;
9 ~, h+ Q, ~4 n. }' F: l3 s" L  }- Q  M1 J  g, h# `) h0 {1 T* z, e
}1 U" T1 }0 D4 ?/ z, X

$ C9 h1 s7 |6 n) k' |  y% t5 x! N2 c$ A% }
【 NO.2 使两字符串互为字母异位词的最少步骤数】% [% S7 Z5 ^# b5 s4 P) t

% w) `# K+ p9 D$ O$ Z解题思路
* F2 R2 X" v' w8 j2 `9 U字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
( ]/ g, O' R' M8 `% R2 U. `. |4 t; `, f  N2 L7 y% e, E
代码展示( M7 {* ]0 n/ S/ v& `' Z( X
class Solution {+ ~0 R8 d  N9 V% L
   public int minSteps(String s, String t) {; ^( i( L) R. W5 \( `
       int[] countS = countLetters(s);% @3 n7 z0 E8 k
       int[] countT = countLetters(t);' [/ ]. f1 p, |! B" M* f
       int result = 0;
9 K+ `# Y6 b1 ~5 T$ b+ d       for (int i = 0; i < 26; i++) {5 b" e  U7 z, y
           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);' N6 p7 N) E; u8 T- l8 l7 J
      }- r4 A: K0 E# b* e! P
       return result;7 ]1 E$ M3 x; ?& @
  }
. p; {- O; p4 v# e- ^( P/ ~  M1 A9 V( D) y' b8 u2 q
   private int[] countLetters(String s) {
; k  U- o$ U2 G7 t       int[] count = new int[26];
  n6 u7 R3 @& c% z       for (int i = 0; i < s.length(); i++) {
' y; h& Y9 o  x           count[s.charAt(i) - 'a']++;
  H4 s+ l/ {& }2 {      }; y1 J. B# B- O+ t) J$ X( M
       return count;
0 Z. b* \# z' C- H: x- t  }( p" a" |! n3 t" X& J: V
}
3 H1 Z; o" x; z% K; E. J) J% m( [1 j

0 a8 F4 |( q0 i【 NO.3 完成旅途的最少时间】( K' I( q- @: O8 N+ f
( i4 g) m; q7 b7 d$ b
解题思路% g2 g. D" r/ z  u) S  X$ @& Z
典型的二分答案题目。
! o; u" P6 {+ J, R5 @+ \" ~% _& S: S0 m# N+ i* E
代码展示
1 G4 z9 F& V. O! _class Solution {
5 u2 ~/ _+ H; U7 ~# m   public long minimumTime(int[] time, int totalTrips) {
8 r2 M# O; c" F" n       long left = 0, right = (long) 1e14;( Y& D% O% s, M7 D( g
       while (left + 1 < right) {% |3 R% H$ C; ]. k
           long mid = (left + right) / 2;
8 {( N" f) h/ R2 u" b0 n2 N, k) x& K3 C           if (check(mid, time, totalTrips)) {
  N8 c# S) m2 V8 o5 [0 f% U               right = mid;" e% v. a4 e, g" }
          } else {/ _" {  h1 Z) `5 S# h. e5 N% B- V
               left = mid;2 W/ q7 _& l7 @5 V
          }
; ]% X; m6 V) r5 J; D9 J9 m: U      }
9 N. I, t9 h% V       return check(left, time, totalTrips) ? left : right;
$ l' I' ~+ ^1 ]: n  }$ V  V- G  V- I( C" F' G
) H1 `5 H4 E4 D4 f# d) L
   private boolean check(long limit, int[] time, long totalTrips) {
8 M6 @9 [* k) ~: Z       for (int t : time) {7 s6 a) b7 T, c9 y+ H) B) ]5 x
           totalTrips -= limit / t;+ F' V+ }3 K  }9 S- m6 v
      }4 J  i+ J- f& M9 E. p
       return totalTrips <= 0;
2 w4 Z* f; S, V  }
$ ?& ~  k# a% Y2 ^; H6 N$ i}6 z& e# c! o" d& F3 Y9 G
. _- O2 g- a0 c3 t
【 NO.4 完成比赛的最少时间】
3 e9 C* ~  l. R4 e* k1 W
7 E8 n% j1 ^: V7 F& G解题思路
' g" w  c: }8 ]: X, q8 n动态规划问题。# W% ?! v- u& M, T, X

! x9 q! k, M# Z: ?" ~! @& |先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
# Q5 O: P+ Y7 n! i5 @* z
: `/ P- a( X" @% F然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
( S  x4 U4 W+ l3 q! [6 B& e9 [/ h1 D
1 p& Z  ]7 V: x注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。; L% F7 w3 H) s

1 M( |) \' T* ~8 x0 K$ w8 q由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。2 F0 O) @0 `5 M' D. ~! f* l
+ _4 X$ H8 v* H6 y( y
代码展示5 {( I% n# U. N
class Solution {. Q" ~1 E' U, D% @5 B
   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
" n. C6 v4 H: Z2 ?- T1 i+ u8 a       // g[i] 表示不换轮胎完成 i 圈的最短时间
3 A  R) Y2 V. L; Y% x: v# s4 m       long[] g = new long[numLaps + 1];0 t. H7 r1 u7 q5 n- c
       Arrays.fill(g, Long.MAX_VALUE);* _2 n' t. P# M9 V
       for (int[] t : tires) {- C- v2 ?7 g- j1 X# X3 q, B5 W
           long pn = 1, sum = t[0];6 M  _: i/ n$ \' S  g* P
           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {, g; r+ \# o" k/ ?0 f  i8 h
               g[i] = Math.min(g[i], sum);" f+ {2 @% U* E; z* }
               pn *= t[1];
6 j( m  e$ M( j3 O               sum += t[0] * pn;
% s: v" a. y+ a" y& z          }4 y2 P9 E$ c; E0 X
      }
. ]% a/ s0 W3 t6 G. y
" x3 c/ z0 M% b% z* M       // f[i] 表示完成 i 圈的最短时间
# G+ E8 }1 b. x/ d" S! u0 q6 ]4 ]       long[] f = new long[numLaps + 1];
6 `1 f- |" ~  K* y       Arrays.fill(f, Integer.MAX_VALUE);- Q+ L* P+ g3 F; x
       f[0] = 0;
2 _+ I* `7 \+ B. y) x, M       for (int i = 1; i <= numLaps; i++) {
1 }" L4 m  i9 `           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
8 K& k( p0 n. |               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
& n4 q* o) D& f! I; O          }8 h0 L; I8 X, P, w" O# v% S0 {6 T
      }
* q2 Z7 Z# ~: w$ x9 k: m; F  P       return (int) (f[numLaps] - changeTime);" Y0 \2 }+ F& X0 X
  }: S% P# L/ ?" c' M4 d
}
* Z5 }' L0 b$ }$ d9 `
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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