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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑 2 P* z' _, y% c% }
( I3 x3 O% P! y. i8 n
No.1 哪种连续子字符串更长
解题思路
签到题。
代码展示
  1. class Solution { % e$ d9 `: i3 g
  2.    public boolean checkZeroOnes(String s) { & I+ S- I% Z" C* }' p. ]( E
  3.        return check(s, '1') > check(s, '0'); 4 |5 R$ N: `* K( ~
  4.    } , V% n7 h+ L# x) n7 A
  5. ( e% z' n, M9 ^1 U8 g
  6.    private int check(String s, char c) { 4 q" [$ |4 d; @; b) ^1 u
  7.        int result = 0, count = 0;
    3 S1 O$ J$ g: m7 l7 i. N( T
  8.        for (int i = 0; i < s.length(); i++) {
    1 v$ I- k# `+ t. w' d7 |3 h+ E
  9.            if (s.charAt(i) == c) { 9 P2 X. Q. Q  w; f% c7 Q
  10.                count++; ) c8 d+ f; h3 a  y- l
  11.                result = Math.max(result, count); # [: P6 s& x* @' F: d' ^6 U
  12.            } else { 5 x$ m* h2 o2 i6 g) H
  13.                count = 0; " l( w' e3 w5 u& }" v9 J" ]' h
  14.            }
      p2 {" @/ y6 W6 n
  15.        }   h# N, r5 B$ ]9 t  n& q
  16.        return result;
    $ N' x; [) \( H8 ~& I4 k
  17.    } . `: s+ e9 u% ?8 ?6 S
  18. }
复制代码

& M2 G5 ~1 {! ^( \
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。
带刷内容源于Leetcode 原题/近期大厂算法面试真题。
模拟面试+面试技巧分享,备战秋招!
只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动
活动时间:2021/6/1-2021/6/25
No.2 准时到达的列车最小时速
解题思路
二分答案。
对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。
代码展示
  1. class Solution { % S6 I. _, ~+ k; X4 t1 z; S0 o
  2.    public int minSpeedOnTime(int[] dist, double hour) { 7 W6 n: H+ }- e1 L
  3.        if (!check(dist, hour, (int) (1e7 + 1))) { + S$ _. Q/ j7 n6 T5 }) M$ G4 E( ~
  4.            return -1;
    5 s4 k0 S6 k% Z: f+ P+ d
  5.        } & O3 Y4 ~" D& `$ @; G% I' f
  6.        int left = 1, right = (int) 1e7;
    ) M7 P4 O" o7 M" j. V
  7.        while (left + 1 < right) { . S. O9 }" G' u# ]
  8.            int mid = (left + right) / 2;
    ; C  [3 T( ~% R% O! g, |% R
  9.            if (check(dist, hour, mid)) { . W( {9 j, `% F) j& G
  10.                right = mid; ) t6 B5 f, I& K7 C, Q
  11.            } else {
    - W# L5 Q& Y! n
  12.                left = mid; ; R. D9 S& z9 r1 H
  13.            }
    " t1 c/ s' \" m
  14.        } ' b- h& t- ]. ]% [
  15.        return check(dist, hour, left) ? left : right;
    ; D. j, N5 h8 q; O
  16.    }
    ; }6 @0 ?+ L; V- w% O6 B& I
  17. 3 y- B3 ]9 i8 _7 S6 t5 P
  18.    private boolean check(int[] dist, double hour, int speed) {
    # q2 @& L" V: c0 J7 |% T! H
  19.        int cost = 0; + R8 ?+ ~: }- X6 f6 g
  20.        for (int i = 0; i < dist.length - 1; i++) { 7 n- o8 H& U& O+ T5 ]% y* R
  21.            cost += (dist[i] + speed - 1) / speed;
    ( `. t* P7 v% S0 ^- e6 l
  22.        }
    ) y' d, p7 a7 J! }- X. n/ y+ y
  23.        return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
    9 X0 {( c& s! c( o$ v# w0 i5 [' W6 a9 S
  24.    } ; ~0 d* O5 W  d
  25. }
复制代码
0 ^1 }. k" D, z; ~# f9 Y
No.3 跳跃游戏 VII
解题思路
类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。
代码展示
  1. class Solution { 2 A% T& D0 J! B; i6 q
  2.    public boolean canReach(String s, int minJump, int maxJump) {
    8 v; i1 d4 F4 D: g! b
  3.        int n = s.length(); $ ~7 B7 t, q, x" _! v1 G
  4.        char[] str = s.toCharArray(); 5 R, n1 N" y+ Y
  5.        if (str[n - 1] == '1') { 4 C$ {5 M) H" g( S9 w3 T* z! l
  6.            return false; 2 N/ J! s7 i7 R7 @( D9 B
  7.        }
    5 K! |3 t! }1 S
  8.        LinkedList<Integer> queue = new LinkedList<>();
    , p+ M% M' k$ Y$ O$ S  ~, H9 B; |
  9.        queue.add(0); 0 L( Z: z$ r8 O& l* k
  10.        for (int i = 1; i < str.length; i++) { ! b& a7 O1 y6 R
  11.            while (!queue.isEmpty() && queue.getFirst() + maxJump < i) {
    ' |  s7 G' C3 A) w, m
  12.                queue.pollFirst(); 1 K5 |7 z  Y* z* F* C8 l
  13.            } % r  g9 I( W8 ^6 W5 H( Z1 G
  14.            if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
    ! V" z  x1 N8 I: g
  15.                if (i == str.length - 1) { ; h) m" m$ q! k. D  P
  16.                    return true;
    8 T$ u5 Q) M6 C! ~2 l2 `. H1 m$ Z* n
  17.                }
    $ B7 u5 E4 k$ R/ ]0 L' O: n: s$ F
  18.                queue.add(i);
    : ^* a$ |% W* M# }  `. Y/ l
  19.            }
    " I7 Z, F( `( p% X( V! s' e2 Y" {: d
  20.        } ' O0 h6 U: w4 s! a# @
  21.        return false; 6 r, _# o2 k, K6 w, F
  22.    }
    5 |7 v5 u1 ]+ S6 A
  23. }
复制代码
No.4 石子游戏 VIII
解题思路
看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。
代码展示
  1. class Solution {
    ! K8 q& G& S' |6 V
  2.    public int stoneGameVIII(int[] stones) {
    ! S& O+ u- p$ P; I3 n
  3.        int n = stones.length;
    9 H' t2 i1 i; ?) w! q9 ^
  4.        long[] sum = new long[n]; / y; l+ R4 C2 r9 j1 p! c. }5 A, F
  5.        sum[0] = stones[0];
    ! G+ F9 z+ ^* n2 T
  6.        for (int i = 1; i < n; i++) { 9 U" A1 e+ Y" }+ R  Q/ _
  7.            sum[i] = sum[i - 1] + stones[i];
    9 ]( T6 p0 q5 o" `2 M
  8.        } $ F) ^6 E0 V% `8 T* W+ _" f
  9.        long[] dp = new long[n]; 2 A' D7 T* \, ]- L$ w. b0 B: Z
  10.        dp[n - 1] = sum[n - 1];
    7 d- B) K1 {' k1 ~4 W
  11.        long max = dp[n - 1];
    * H! e1 y; K2 o, L
  12.        for (int i = n - 2; i > 0; i--) { 3 x* v. l/ S* Q4 B# r+ f1 w7 Q- Q& H
  13.            dp[i] = sum[i] - max; 4 G6 c7 V0 J% S+ v. H: {
  14.            max = Math.max(max, dp[i]);
    6 T7 g& j6 q  C$ }
  15.        } 8 A4 P1 D9 [- h& s! }2 n) p$ }
  16.        return (int) max;
    * W! S" w0 {; \! o( U1 J
  17.    }
    ( d  \7 @, R- v) B) V% D
  18. }6 R' d+ Q- |$ L# o0 }; G
复制代码
  k, _+ e7 H3 _- V1 |
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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