找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑 + X. j5 o2 z  k6 O! ^+ ]
, z0 Z: C; u9 B( _3 y/ W
No.1 哪种连续子字符串更长
解题思路
签到题。
代码展示
  1. class Solution {
    ' O5 f; H' {) p8 `& c" G: w
  2.    public boolean checkZeroOnes(String s) { 7 l  o: Z8 Y& M4 P
  3.        return check(s, '1') > check(s, '0'); $ u7 [$ I- H- T) i# [2 @$ V
  4.    } 4 ?( h! ]' x$ O  W4 S0 m" E
  5. , g. X0 o, L, T% ?: k' P+ D
  6.    private int check(String s, char c) { 8 E7 T0 I' J' R
  7.        int result = 0, count = 0; 0 p/ h( C6 B+ \8 B) C% l4 p
  8.        for (int i = 0; i < s.length(); i++) { 0 j9 l, H- m( ^+ h( G
  9.            if (s.charAt(i) == c) {
    9 l0 @6 h: q1 z, z! h6 T2 Q
  10.                count++; 7 @3 w6 p  p' J9 O: Q0 [
  11.                result = Math.max(result, count); - j2 E1 E+ g( k' }7 v4 I, a- r+ N
  12.            } else {
    % h2 V- S8 G2 D3 d2 M$ ?! ^+ g
  13.                count = 0;
      w# q6 o) R9 I6 O( w
  14.            }
    1 k9 Q5 C4 k; ], p5 \, u
  15.        }
    & `$ |: r' ?5 M( I( v# s1 D3 [
  16.        return result; " S- [; W1 D8 h( q  Q
  17.    } 5 J  L# D+ P! k4 |
  18. }
复制代码
- a+ Y+ Q+ h' R9 k& e0 M
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。
带刷内容源于Leetcode 原题/近期大厂算法面试真题。
模拟面试+面试技巧分享,备战秋招!
只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动
活动时间:2021/6/1-2021/6/25
No.2 准时到达的列车最小时速
解题思路
二分答案。
对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。
代码展示
  1. class Solution { * G3 }2 E2 |6 T# Z2 p
  2.    public int minSpeedOnTime(int[] dist, double hour) { 2 W2 z% y0 j% k1 y; `; e# Q
  3.        if (!check(dist, hour, (int) (1e7 + 1))) {
    ) {  I3 n) G4 I* R2 w+ X/ t2 r
  4.            return -1;
    ! ^# Q* p+ \: s* g. }
  5.        }
    - ^$ I6 P; s. A# H6 y" c
  6.        int left = 1, right = (int) 1e7;
    2 X4 H( V% Q, e. }2 M
  7.        while (left + 1 < right) {
    5 S" R' Y# {* i: b- G
  8.            int mid = (left + right) / 2;   @* N  S1 S# Z: m% H$ J3 }0 d: ^
  9.            if (check(dist, hour, mid)) {
    6 O! c; v5 Y; o
  10.                right = mid; / [9 F- c, g2 R  c0 _7 U9 u
  11.            } else { % ~  Z1 p2 l  J& f0 Q5 y
  12.                left = mid;
    2 n% G1 @! k4 C
  13.            }
    0 ]  C  n3 ~& _! N/ [: r0 G7 {
  14.        }
    ( e/ A. `! @1 ?: Q! i
  15.        return check(dist, hour, left) ? left : right; ( y# X3 }6 |+ \
  16.    } 5 @. l, h: H+ v1 ]  Y
  17. 3 L, p7 I# G0 I5 v# j+ {# O
  18.    private boolean check(int[] dist, double hour, int speed) { , ?$ H5 j6 v6 R, z# ?! |8 ^
  19.        int cost = 0;
    " S+ r1 O' G% d) t- ~! s% W( L
  20.        for (int i = 0; i < dist.length - 1; i++) {
    6 Y9 W' X" R9 e' H# a/ W* j& R1 J
  21.            cost += (dist[i] + speed - 1) / speed;
    3 [  E. M9 J0 |: a2 n* @2 N
  22.        } 5 h/ [9 x  T6 u
  23.        return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
    , M$ ^; Z$ a' s1 m
  24.    } ; Q" g' {8 z0 }* L
  25. }
复制代码
7 h: J- M) H& \1 h2 `
No.3 跳跃游戏 VII
解题思路
类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。
代码展示
  1. class Solution { * ]% l7 S/ P, R7 f
  2.    public boolean canReach(String s, int minJump, int maxJump) {
    # A! E# K) P. N% `9 `3 B2 x* Y5 Z
  3.        int n = s.length();
    ; f% o: w6 }9 y, ^, K$ `+ T: A+ x
  4.        char[] str = s.toCharArray();
    ; F2 h" f2 C8 d% U: t
  5.        if (str[n - 1] == '1') {
    9 G3 [# N$ x+ `7 G
  6.            return false;
    8 a7 Z/ v9 y# F
  7.        } / X& x% @6 T% z+ ~( U
  8.        LinkedList<Integer> queue = new LinkedList<>(); 3 V  S& C4 c$ ]1 t
  9.        queue.add(0);
    " x$ k( _9 U9 z. w$ ^
  10.        for (int i = 1; i < str.length; i++) {
    , l+ g/ e9 Z& I# v/ J6 g
  11.            while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { / @: {7 o* O- u' A5 \8 N0 x( d
  12.                queue.pollFirst(); 7 x7 L; j; P. h; E5 }4 v
  13.            }
    / e4 D+ v2 R! R
  14.            if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) { 2 G2 Y; o* t( [1 S
  15.                if (i == str.length - 1) { 6 i8 s3 O; H7 w- J5 ^# |
  16.                    return true; 7 ~. K" ~' e2 a, s6 [
  17.                } 4 U4 I6 A" D2 `+ {- T
  18.                queue.add(i);
    9 F' D+ p5 S; k7 g
  19.            }
    8 I+ \9 H. g3 O2 V
  20.        }
    / V7 N( D3 v" Z" L
  21.        return false;
    * t5 ^1 ~1 V5 R4 n! W
  22.    } 4 m$ _7 _- m- r8 @
  23. }
复制代码
No.4 石子游戏 VIII
解题思路
看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。
代码展示
  1. class Solution { - {5 Y+ {0 X# \. g2 t
  2.    public int stoneGameVIII(int[] stones) { 3 _! b+ X% R3 W7 X7 ]
  3.        int n = stones.length; 4 h  C3 C$ o+ m3 ]& a/ ^$ U9 }4 C
  4.        long[] sum = new long[n];
    . ^$ \. P, {2 q' a- k' y+ z- l: f
  5.        sum[0] = stones[0]; ! @2 t; k7 c0 N: e" `) P+ q+ `
  6.        for (int i = 1; i < n; i++) { 9 p: t6 @( V( Y) y2 p# S# ~$ m
  7.            sum[i] = sum[i - 1] + stones[i]; 4 ~( Z# a: Z# B' H! F
  8.        } 3 Z* e" u. ^4 G! I  J/ A5 {( \
  9.        long[] dp = new long[n]; 2 X- s3 d3 g" U) E
  10.        dp[n - 1] = sum[n - 1];
    4 Z$ ?8 W6 z. T
  11.        long max = dp[n - 1]; 4 \* i" R, u! W: t1 ]6 X
  12.        for (int i = n - 2; i > 0; i--) { 3 D$ u$ g0 q( \6 X' V
  13.            dp[i] = sum[i] - max; 8 K7 {" G- S6 p" r- k
  14.            max = Math.max(max, dp[i]); + T/ |! p: r& ]
  15.        }
    2 Q4 V( Y& h% G( @
  16.        return (int) max;
    $ [: t* Q3 H5 a+ ]
  17.    }
    . i7 x6 d% }7 I6 o% S
  18. }# l* `+ d3 I: U" f! R5 |/ v( n
复制代码
9 C( @! m$ O# C6 n% |% ]
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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