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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】2 h( y( c6 x! n/ U3 C
9 \+ T) a, @2 C
解题思路/ E+ c- t* ?1 g) Q) y: G/ _
签到题,枚举即可。
2 _; ]; j( Q$ v: U# D2 v
2 K- Y2 _8 x3 T4 Z8 a/ K) M6 O代码展示
& H# C  g# b4 y% S6 H
+ d0 `& h0 Q1 ^8 v  z& P5 Qclass Solution {* z% z1 A" T2 D0 `/ e7 F7 B
   public int prefixCount(String[] words, String pref) {3 x! B: p8 G) ~; Y" S2 N. |$ J
       int count = 0;2 ?3 e$ K. A3 ]5 Z/ o$ j
       for (String word : words) {
8 P2 N# {( _3 g; L. m) h9 X* P           if (word.indexOf(pref) == 0) {" I/ z) b4 A7 j1 D8 r
               count++;
! Y0 I$ q& i$ m& [  X9 W  @          }
! S7 L$ b! F& l$ o2 `( t% Z      }
; T+ a! M4 M) }. m; }6 [       return count;
9 _! P* n% E# [, P6 ?5 @9 h  }  R* X# g6 g8 _* I/ u# c
}
- l- F' M5 q4 ^2 b8 E1 V3 ]# n3 ^
6 v3 p3 N  B" d0 E0 O, F" y! i. O/ h, D
【 NO.2 使两字符串互为字母异位词的最少步骤数】2 [* j* k6 ^. g$ v

) D+ g! ~8 C" x  a解题思路! E9 b. |0 Z, c1 D" v$ |3 s
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
% C' m$ X" ?# ?
+ B. Z4 t/ e9 r代码展示
' Z7 G" H! V) ^; N! Aclass Solution {" J/ W! J$ n% t+ r5 `3 @+ }
   public int minSteps(String s, String t) {* e8 k* s; }1 y, n  e7 B
       int[] countS = countLetters(s);) G  a2 f' V( }
       int[] countT = countLetters(t);
  |& I9 w- @' q       int result = 0;
6 ~6 y9 ]+ C/ q6 C' G  D+ `+ G       for (int i = 0; i < 26; i++) {
5 F& K. o/ H+ W; p1 [5 v           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);! P+ S. O: i3 u% M' F
      }
  ]* p, M0 L3 r% F7 N       return result;$ X% q. {( E+ ^8 K% ^! ~
  }$ W9 i& e, G& E; u# P8 U4 t- u
& V# F' R- |5 e4 u, F7 j" j
   private int[] countLetters(String s) {$ O4 A; P7 n- V9 Q; t) n1 ^% c" K
       int[] count = new int[26];# x3 d* O9 R8 |  K
       for (int i = 0; i < s.length(); i++) {3 S: P8 U% n+ q, C7 L  b
           count[s.charAt(i) - 'a']++;
) \  f4 V2 N$ ]/ H* \* {  Q; ~      }! O) Y* d+ a( d' G" q2 x; d
       return count;  m/ B2 j, r9 e% j7 Z' Y
  }: Z1 T& C' y6 U; b
}
+ [* L5 r! C1 f# |3 Q! q- b! B. L% W( }& Z% G+ q# ?9 i

9 O+ K1 g, k2 [/ m: Z: F! y【 NO.3 完成旅途的最少时间】
  J- Z) v, g* L7 C0 C# w' R' E+ N2 P9 H, d5 k, f( O' J+ r
解题思路! w4 X& E0 u) M- S
典型的二分答案题目。5 n7 Q3 k! a% o8 z2 C9 ?' y

0 L+ G% e  z, S9 |) b代码展示$ K; ^3 k% L4 `2 q4 y1 m% ]. |
class Solution {
4 L; u, J& o4 ^* E  f   public long minimumTime(int[] time, int totalTrips) {
, a8 w  E! k) }9 p+ v8 T$ ?0 y8 {2 L- x       long left = 0, right = (long) 1e14;0 j# g2 T/ J$ Z
       while (left + 1 < right) {
- ^6 A6 m, L# ~3 K1 R2 {* `( M: ~! c           long mid = (left + right) / 2;. j" M2 q2 C! q8 ]# L* i
           if (check(mid, time, totalTrips)) {
: l! u# v) r6 i) N7 C- ?5 G6 ?               right = mid;- |6 g0 {# `8 U0 c# h
          } else {+ R! x1 S+ p; P. q
               left = mid;, f/ I" o& x( a( T
          }
3 }3 y- v+ [" Q/ ^' N      }5 ?9 U% i' M* h  S$ O: S
       return check(left, time, totalTrips) ? left : right;
$ j( P2 e0 V( W" A  }
2 H6 d1 C/ x5 A, p7 s" g7 F
7 ~+ [! L( z6 `# ]( Z0 J" p6 B) F   private boolean check(long limit, int[] time, long totalTrips) {- v0 f7 ]. R$ t' p1 [$ Z: r
       for (int t : time) {! F& M# }' d7 f& y
           totalTrips -= limit / t;6 \) p& {' e+ g' L) p# c* c
      }
; `8 l9 h" P6 h* G5 x. r8 O       return totalTrips <= 0;% u, k. q) B4 T
  }
  @& I, g9 D5 c$ Z7 `* I) C}# \6 C9 g. B! I4 C: R; t

, q1 y3 q/ U8 o$ z【 NO.4 完成比赛的最少时间】( i( s$ y! }, G( E- }3 v+ g

, V7 a3 t" ^9 n2 x! Z解题思路
$ N4 X/ A: J2 P动态规划问题。5 z( |' [4 G% [( r

) s: t, {- E) x& z. ?" @先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
: S  k5 i* K# P' y' U
) O5 G6 y8 C. u# A! _$ y然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
+ g. x4 Q& g) r! m3 w* N' s+ a9 {, Z+ I0 y9 N
注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
) C) m* H/ R# f6 V7 I( c6 n$ T$ C; K6 R5 H/ Y
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。4 _+ [  h4 U; E

7 g) Y& ?- c6 `! @% Y; A$ E代码展示
/ B3 M; A$ Z% _' z7 M3 _class Solution {2 k, t' K) d. u# g
   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {- J# F( x* z9 q& ?0 C2 j
       // g[i] 表示不换轮胎完成 i 圈的最短时间3 z8 F8 c. Z3 n4 i) {$ o
       long[] g = new long[numLaps + 1];
" s: X5 ]5 e* W8 d0 W       Arrays.fill(g, Long.MAX_VALUE);' q7 M) O1 o( P+ V( G
       for (int[] t : tires) {
( }9 U) h( G% e+ K' F: W           long pn = 1, sum = t[0];
% B) k) N$ R" ^" a4 @) ]: q- }* |' A           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {9 H3 [0 ?' k4 V* G" f  {# s7 g
               g[i] = Math.min(g[i], sum);
8 f3 K9 ]0 N2 U. Q$ J' a( {/ X% ?' e: {               pn *= t[1];+ m7 b' L0 I& j9 |( x
               sum += t[0] * pn;' V; x& a' o; h# j6 [  M& ~
          }
6 I5 V1 s# \* e      }
' `' Y- d2 m2 Z" O* u0 ^0 b' s- j
9 ?8 L4 z% ]2 x$ R5 N, w5 a       // f[i] 表示完成 i 圈的最短时间
9 j( C; l4 t+ P* y       long[] f = new long[numLaps + 1];, ~6 ?: ?8 r9 E; t/ G% c0 {
       Arrays.fill(f, Integer.MAX_VALUE);
* z$ [# q6 ^1 }, z0 W$ P8 S7 \       f[0] = 0;9 c4 t( A; O4 u5 v6 M' j: O8 `# z
       for (int i = 1; i <= numLaps; i++) {# w9 }+ S8 Y) P; q; k# x1 ]
           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
; `+ W# F% }& P. M1 r               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
. V. p2 ?- V5 t2 ^, E& [          }
, C& V: T; X1 |! b6 }1 j: a      }8 H( W: q3 m2 _' Y. e' e% e3 i4 ~
       return (int) (f[numLaps] - changeTime);
& ?5 @9 _. g* o* |% o  }: }) M  {8 u, _+ V- S
}
. W& k/ v5 X" i, g, z: W
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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