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

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

上岸算法 回复:0 | 查看:3543 | 发表于 2021-5-25 23:22:10 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑 $ |1 C- e! c1 ~9 {2 ]* y

7 }* Y$ C7 j3 M- F7 x9 O
No.1 哪种连续子字符串更长
解题思路
签到题。
代码展示
  1. class Solution { $ v2 x# V( Q8 Q6 }5 o! W7 L( z
  2.    public boolean checkZeroOnes(String s) {
    / w9 R) H6 j: h5 e: y/ q
  3.        return check(s, '1') > check(s, '0'); 8 l# O8 w/ t: z0 ?- s. |
  4.    } 4 M$ z3 o4 Q( |
  5. # S- T* i4 C. x, I! e
  6.    private int check(String s, char c) { - w3 U. V  o" B7 w, z% O3 n" v
  7.        int result = 0, count = 0;
    5 \7 |( D$ S3 ?; B" a% f0 W. X# G
  8.        for (int i = 0; i < s.length(); i++) {
    0 X5 V; v& q6 v2 G
  9.            if (s.charAt(i) == c) { ; b7 i6 d2 }. z! l7 L: I0 p
  10.                count++;   b3 G3 h+ `( B6 R& w
  11.                result = Math.max(result, count);
    " R& R2 A4 {- b4 U- \8 p" R- D
  12.            } else { & v, S0 a7 T" ], ~
  13.                count = 0;
    ; T/ F& h9 n* S" A+ Z  K# K& c+ Y
  14.            }
    . ~8 A9 j. u3 ~) e  v
  15.        }
    8 @/ Y1 U8 G$ t' `. n% S2 N7 o( L
  16.        return result; 3 Y  q( Q9 M1 V5 W$ R, d! d
  17.    }
    ! p6 U) s: Y( {: C1 g8 C0 w
  18. }
复制代码

4 I! m/ m2 q' p" l. ?8 U% W
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。
带刷内容源于Leetcode 原题/近期大厂算法面试真题。
模拟面试+面试技巧分享,备战秋招!
只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动
活动时间:2021/6/1-2021/6/25
No.2 准时到达的列车最小时速
解题思路
二分答案。
对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。
代码展示
  1. class Solution {
    - O- ], O4 L8 D8 a# b0 ~& P
  2.    public int minSpeedOnTime(int[] dist, double hour) {
    ' Z' ^$ a) \0 b7 ^
  3.        if (!check(dist, hour, (int) (1e7 + 1))) {
    : I3 V5 ?# l1 w* S
  4.            return -1;
    . j& t+ q) X% j
  5.        }
    + n. F! A$ {0 Q9 K2 u
  6.        int left = 1, right = (int) 1e7; # u$ L* W7 @7 N* C
  7.        while (left + 1 < right) {   g+ o, w6 N2 E, M
  8.            int mid = (left + right) / 2; ! O" M2 B5 ?! B8 h7 P, F% u
  9.            if (check(dist, hour, mid)) { ( Y4 _  M2 Q1 G
  10.                right = mid;
    % b* L& D- v0 ~! V
  11.            } else {
    # W3 J0 e+ _2 c/ b
  12.                left = mid;
    ; |: }6 \2 v9 z2 r3 y
  13.            }
    : a  C/ ?% o: D% w. d0 r3 E. h  L
  14.        } , l; U0 _; G% p8 N6 `3 {( I2 e8 M! U
  15.        return check(dist, hour, left) ? left : right; & N- q6 Y- w) k. w: t3 b2 ~; ?( Y
  16.    }
    7 D! P( J* k. {& [+ Q. s" ]
  17. * Q+ d9 J& ~+ K+ G8 o
  18.    private boolean check(int[] dist, double hour, int speed) { 2 e7 l* z. N4 y! Z" a5 H* s2 _) M
  19.        int cost = 0; 4 }3 O. x% {8 w* A0 [1 O/ [
  20.        for (int i = 0; i < dist.length - 1; i++) { . ?: h! @$ F2 M. w- Q3 V5 f
  21.            cost += (dist[i] + speed - 1) / speed; 9 \6 H( k) W, H
  22.        } & h1 N$ k4 w- _) w
  23.        return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
    / j/ k, C4 [  k( ~( F5 H( X
  24.    }
    ( `: s) p" y: i0 P# {7 d. r/ A
  25. }
复制代码

: S/ U6 m! B, j/ d: C4 x: @
No.3 跳跃游戏 VII
解题思路
类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。
代码展示
  1. class Solution { $ `& v% @2 s% Q1 ]2 z; O! ?
  2.    public boolean canReach(String s, int minJump, int maxJump) {
      h7 l- k% z) K3 l9 m* v4 E0 L
  3.        int n = s.length();
    # |0 f: b. G: Y$ ]$ T2 O6 |4 [
  4.        char[] str = s.toCharArray();
    + ]6 b8 `" g6 x2 E1 ?
  5.        if (str[n - 1] == '1') {
    & t3 R% S9 {! I$ O5 H/ `
  6.            return false; , [6 h: l) u5 f, ~& K$ m
  7.        }
    : K+ l: |4 n7 Q5 S/ a
  8.        LinkedList<Integer> queue = new LinkedList<>(); 7 c, ^# f: g- T. N- e7 X
  9.        queue.add(0);
    9 M" ]+ n/ F- S3 s1 J) O
  10.        for (int i = 1; i < str.length; i++) { % e2 x6 |  |( S& N( f: K3 J
  11.            while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { # w: b5 T( |  G/ ~8 r, t
  12.                queue.pollFirst(); ( F1 ^8 k' X$ U$ ~+ K
  13.            } ! Z* ]& g2 D6 C4 ^" P% I
  14.            if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) { - @' K! r2 p3 |; B
  15.                if (i == str.length - 1) {
    4 [4 ?/ j# ~4 O& ?
  16.                    return true; / ?7 e! F" B# d8 Z: U) g9 g
  17.                }
    $ O; Y; [# k) s
  18.                queue.add(i);
    & c, Z, d* I3 p1 T. E! h  k0 u
  19.            }
    - U, Y  @& `+ c7 |. E: y9 u
  20.        }
    0 R  b" B3 z/ a5 ?  W' {# c
  21.        return false; 0 @  W0 A: H& x. a) r) V
  22.    }
    ) W# Q' a% _& q# z0 j; E: |
  23. }
复制代码
No.4 石子游戏 VIII
解题思路
看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。
代码展示
  1. class Solution { # E" ^6 [: A" c. S
  2.    public int stoneGameVIII(int[] stones) {
    3 A: z1 f" Y" S  b4 Q. G, |
  3.        int n = stones.length; 0 m& V( I; K. w
  4.        long[] sum = new long[n]; ! M4 S, \- x% W4 B. ?
  5.        sum[0] = stones[0];
    - i8 A: B7 H+ b- N) e
  6.        for (int i = 1; i < n; i++) {
    % T# W5 r3 j2 |, U" l. b
  7.            sum[i] = sum[i - 1] + stones[i];
    1 F3 t# M1 |. }6 m# v
  8.        } # o7 H7 j5 d! m' g- T
  9.        long[] dp = new long[n]; , R( H  S. |2 Y0 \% @, ]- ?+ n& B7 I0 s
  10.        dp[n - 1] = sum[n - 1];
    & Z: a" I, s* O
  11.        long max = dp[n - 1]; % T5 ?5 X  X3 H, f% F& B4 x
  12.        for (int i = n - 2; i > 0; i--) {
    9 g1 `5 N* o/ E6 D' r- b
  13.            dp[i] = sum[i] - max;
    % s3 o& N8 [3 ?0 x/ F- q; b+ v( a
  14.            max = Math.max(max, dp[i]); : F. s$ w5 O) E: R+ R; W
  15.        } 7 V/ q1 H0 K9 k) q& @9 W2 a7 b; G" y
  16.        return (int) max; / C3 f. z: i" [; H$ [0 g  R
  17.    }
    & n+ k8 }' V+ e
  18. }5 ~/ F  M" N% b- L+ f' u
复制代码
9 o" r4 J% E: R# x9 A: g
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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