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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计包含给定前缀的字符串】. Y0 r2 `% |5 g8 ?, a+ l2 B
) R, [6 }4 ~. E6 m2 V# d1 q- Y
解题思路
1 Y$ M8 F* }) X1 E签到题,枚举即可。
" ]/ q3 b3 `. Q8 y/ p0 s" `" _
0 \  y& _1 P% v) G, w2 R代码展示7 f+ M/ l. ^  m' d3 a

& e  N# n: }- a+ dclass Solution {
) ^/ F3 |7 D/ D4 {' H) z) |! z1 ]. ]   public int prefixCount(String[] words, String pref) {: }, }5 C+ X& L. b) l
       int count = 0;
+ g6 \6 B" R: Q       for (String word : words) {
, j- M% y4 ]- m$ A! _  |( I           if (word.indexOf(pref) == 0) {
8 e0 i/ S9 @- K+ p* J               count++;
1 S1 _( Y& X7 D6 k" s( H          }
- n* |0 E% m+ o/ [  f( I, L      }
9 x, R& l+ w( E4 U       return count;
1 z- P* v" G& O0 O5 H  }
8 B# x6 D. C7 J6 `6 n' M3 t}% m9 u3 L+ ?2 {6 u

7 `2 y9 R$ x& _) C/ V' r
; W, ~- ]/ `# M【 NO.2 使两字符串互为字母异位词的最少步骤数】
% o& c9 `+ Z( ]+ o0 N$ ]7 j0 p0 b( v, n# i
解题思路; C9 J0 K" U+ `7 j7 ~
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。! i# a. ^# N8 _: H, |
  F; U( F2 B7 j, t
代码展示! V3 {, `& A% Q0 _2 V
class Solution {+ Z. S% c" c  h5 j6 A
   public int minSteps(String s, String t) {
' H* M9 v" w* t. c. n  ?       int[] countS = countLetters(s);" N. H* d+ {4 i+ T) k+ l5 \
       int[] countT = countLetters(t);+ N  r5 E. F& P1 s
       int result = 0;
+ _, W7 w  k5 l       for (int i = 0; i < 26; i++) {
# a3 |- b* U6 X: e+ g           result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);  z. W9 Z. g( O" @- s
      }7 h1 Q& a+ v, _/ [4 t* w- D
       return result;
; i( u. j. {" R5 W! ]& C  }7 K# }6 o4 e9 _6 K) n

- j! x4 ]7 r' |+ T   private int[] countLetters(String s) {( T/ J1 D  k$ H, R! F. e
       int[] count = new int[26];
& H1 ]; Z! f! l8 l/ J$ H4 X       for (int i = 0; i < s.length(); i++) {
. P5 _- p4 \2 q' V           count[s.charAt(i) - 'a']++;
2 g5 L5 }, B+ F% s! i, h% Y# Y" V* M8 T4 S      }
* `7 I% W/ ]& C$ H- G. K       return count;
( f: K7 O5 u$ Z0 b* f  }
& G4 l/ o) C0 h: `* a9 [}+ K7 @; v% X7 ^  K
( c* }* Y" ^. [4 B' n8 i
  H- f2 q0 [/ u1 o/ u! E$ \/ \
【 NO.3 完成旅途的最少时间】$ C$ Q& [# E& a& }' M
/ o7 p9 f! n( ?" z1 f
解题思路
7 \- R( T* f, e典型的二分答案题目。
* T: t: |: W/ @2 t- P, c1 ?$ ]3 O7 I4 ]; I
代码展示+ I  {. i' K9 f5 p; y% j
class Solution {
  w: F/ @# O, v3 i- t, v   public long minimumTime(int[] time, int totalTrips) {) T8 [2 K$ X4 L8 U3 [; L
       long left = 0, right = (long) 1e14;! C1 V6 J/ v9 M) |& K
       while (left + 1 < right) {# j0 v. V4 z* W; S. @
           long mid = (left + right) / 2;" m. x9 ?/ U. R7 ?6 j4 A6 r
           if (check(mid, time, totalTrips)) {& x" C) ^2 Y; ~3 @: ?9 ]/ G
               right = mid;
0 L& [7 M( h% ^6 Y) L          } else {
5 r5 g8 D; k! q0 Q4 P               left = mid;
8 M: `& `# ]8 u          }3 z8 Q4 b5 O" J! [0 ?
      }
3 k  V0 {/ r) _# G/ c* [       return check(left, time, totalTrips) ? left : right;) ^0 R8 V/ C5 Z1 b2 F+ j2 d  Q
  }4 }( p8 f2 {- ~) `' I4 b; H

2 J3 w6 q3 \+ j1 e- s( ~; q   private boolean check(long limit, int[] time, long totalTrips) {/ o/ P% I, w8 `# g/ \
       for (int t : time) {- U& ^4 F- B+ ]2 o
           totalTrips -= limit / t;
4 `; Y* i% L  `6 W9 T      }
7 J" f. N0 b6 ?' ?       return totalTrips <= 0;
  ~* q7 U5 O& J- _9 [5 N+ _  }
4 P  p1 B3 \  F. N: E  ], D2 d}
1 }. O6 r4 i( c( \, q0 a* l3 j. e
【 NO.4 完成比赛的最少时间】1 z) M6 w, W4 ?2 P& a
3 i& Q' p* R" f' M. e! Q( e6 J  _
解题思路1 q. k, H( X1 O7 c
动态规划问题。7 ~- [6 Q7 K% _% V( n
% f* A" ^" N( q
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。" p% q) N% [* A) K$ v6 l' x
" Y7 c' C4 J# J
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }4 [( {- \8 y8 m8 |* |( N

2 b/ K; f# [" y: L" A, z% D注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
* u8 M; b; A3 }' M. f2 ^
% l- L  ?' V6 U4 d由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
6 V. Z/ N! X) x; R- @4 @( d6 o# [, y6 x1 s$ C7 u
代码展示& H( i6 N  s# r7 e/ U
class Solution {1 p( Z. [& {6 {
   public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
( S7 @6 f5 z) f; i2 e       // g[i] 表示不换轮胎完成 i 圈的最短时间! q( F& D2 |7 ]8 g
       long[] g = new long[numLaps + 1];
1 V! |# V. u3 |! ?2 }! t       Arrays.fill(g, Long.MAX_VALUE);4 S% F" C2 Q9 M% t+ @. `1 m
       for (int[] t : tires) {4 l0 `& _0 p. s1 R9 x+ J  f/ F/ H
           long pn = 1, sum = t[0];& w4 o0 |7 w7 e: y6 p" j
           for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {2 v% d# L  q" w! `" a
               g[i] = Math.min(g[i], sum);% P: a- J4 x% }2 H9 L) X7 I
               pn *= t[1];
( C- r& O2 a4 Q2 m) \5 S% e, T               sum += t[0] * pn;2 V/ |0 A7 _& i$ n) M* O- z# c* l/ P" N
          }
. O: e6 o4 I# c9 {. S- i/ ?; U      }
# Y# y$ ]" l; q7 m" c% n& N
; m" r8 e' n4 ~( ?6 o" l: `       // f[i] 表示完成 i 圈的最短时间
5 ?% U# R+ f5 i6 v       long[] f = new long[numLaps + 1];" J- a) V* u7 J( x# `) ^
       Arrays.fill(f, Integer.MAX_VALUE);2 T% K" X9 S$ S1 }9 i& N6 {
       f[0] = 0;5 z6 U% H- I: U% E4 `1 R1 u+ T
       for (int i = 1; i <= numLaps; i++) {! U" o* f$ V! g1 L* g8 a
           for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {' v- W: K+ P& T# ~
               f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);! @/ P7 I9 e, H) Q' V! K0 r
          }$ V& s& B# V3 n& T: y" k' L
      }& `: L* K8 j: E, E! \
       return (int) (f[numLaps] - changeTime);
$ ?( n. D* A; [# d  }$ n) u3 @  A0 l( c( w6 I' }
}
( M, s7 o( E! K( Z/ N* H3 b" N
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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