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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑
3 e$ R" N% b7 W) N- }( Q
/ [  F- y% N/ Y6 t7 S! }$ F, A
No.1 哪种连续子字符串更长
解题思路
签到题。
代码展示
  1. class Solution {
    ' E) E' }  B& p; x+ V
  2.    public boolean checkZeroOnes(String s) {
    0 o$ T, ~! ^( O7 e
  3.        return check(s, '1') > check(s, '0');
    % q/ ]+ S. B2 \+ X
  4.    }
    % i' X' {$ R, }. d

  5. 3 J( j3 e) a4 G; i- e3 C% H1 K
  6.    private int check(String s, char c) {
    ( H. W( W0 c5 N& d7 c' W7 x
  7.        int result = 0, count = 0;
    " L5 {, W! B/ j$ w4 z
  8.        for (int i = 0; i < s.length(); i++) {
    # N$ v- a# ^' ]: t
  9.            if (s.charAt(i) == c) {
    , r7 S) n" {4 m  H5 B
  10.                count++; 0 q; X5 \' t8 j! ^) `# A
  11.                result = Math.max(result, count); 4 Z- y# R! @4 U
  12.            } else {
    ) r+ \. u1 _  T0 ?# E. o% P+ \
  13.                count = 0; ( q) J, {2 V* O( H* o0 O  c6 N
  14.            }
    $ E  O# O: G% u. r; F
  15.        }
    # [. h* i1 R# y# ~
  16.        return result;
    ' b" x! l% W" t( ^- ^: b
  17.    } + b" ~) U2 }4 _4 X
  18. }
复制代码
' N# j; i! v9 j0 F8 k  L
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。
带刷内容源于Leetcode 原题/近期大厂算法面试真题。
模拟面试+面试技巧分享,备战秋招!
只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动
活动时间:2021/6/1-2021/6/25
No.2 准时到达的列车最小时速
解题思路
二分答案。
对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。
代码展示
  1. class Solution { 4 T+ Q; c0 `) G3 Y/ ^% Z# @5 \
  2.    public int minSpeedOnTime(int[] dist, double hour) { 6 d+ r; {% i7 q! X; A: X8 s# @4 Q! F
  3.        if (!check(dist, hour, (int) (1e7 + 1))) { 0 U$ s! m6 s# x8 _  F. H
  4.            return -1;
    5 x" d4 [; t0 e
  5.        } ; g$ p3 W6 I6 x- Y; T" b8 d
  6.        int left = 1, right = (int) 1e7;
    : |8 x1 w; k- u+ B0 L# @! S
  7.        while (left + 1 < right) { , W1 V8 f( r" o6 q( w/ `6 U1 U
  8.            int mid = (left + right) / 2; 7 H" m$ c+ A; r
  9.            if (check(dist, hour, mid)) { $ ?* T4 E/ Z7 Z3 `
  10.                right = mid; 9 T' C+ S, g7 A+ m2 j3 l
  11.            } else {
    9 p) d8 D( `3 |$ O6 h* w
  12.                left = mid; 2 z9 ~3 B* \5 F& L* ]
  13.            } # M5 [2 q# ]) k; W1 m+ r
  14.        } $ ^  x3 r* G3 V$ _
  15.        return check(dist, hour, left) ? left : right; , i8 c, U( S3 n% u: p1 ?
  16.    } , ~5 R# ^5 ]+ P7 Z7 i

  17. 7 c! S" ^: `9 h% C
  18.    private boolean check(int[] dist, double hour, int speed) { 7 u- Q- X/ c! d  {  F0 U
  19.        int cost = 0; " X" W% a8 p7 V! l2 c
  20.        for (int i = 0; i < dist.length - 1; i++) { & A$ D9 Z2 P* U+ M
  21.            cost += (dist[i] + speed - 1) / speed; . V9 u' b2 ?/ ~: C; D
  22.        }
    1 G, {/ X; j& d% h1 l* ?
  23.        return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
    ) c  D5 D4 F5 q  j/ K
  24.    }
    8 T1 C  U7 n% K- w/ o
  25. }
复制代码
/ I/ X7 {% [8 b; m' R/ G9 i+ O
No.3 跳跃游戏 VII
解题思路
类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。
代码展示
  1. class Solution {
    * w; I* T; j. W" ], Y5 T# N9 j/ M
  2.    public boolean canReach(String s, int minJump, int maxJump) {
    # q; E; ?( P7 d+ E2 t
  3.        int n = s.length();
    1 |; t4 ]8 S% ]7 ]
  4.        char[] str = s.toCharArray(); $ b2 O8 e% B9 ?, s
  5.        if (str[n - 1] == '1') {
    ! O8 a' }( {9 L# l- Y
  6.            return false;
    - D  w: _+ l0 |5 v' d1 r+ k
  7.        } . m: ~( x+ D' V( f% a; o1 s' r
  8.        LinkedList<Integer> queue = new LinkedList<>();
    1 g1 t3 O# G& B, f, l/ n/ c
  9.        queue.add(0); - y* S/ I+ ]$ R& @
  10.        for (int i = 1; i < str.length; i++) { - d1 x! [0 d+ w0 F- ~
  11.            while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { 9 [* \  I! l/ ~9 M
  12.                queue.pollFirst(); ! [  D( I5 W) ?1 x
  13.            }
    ! y* t, i* h$ g: Y% j! `
  14.            if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
    * y3 m' b; x* \, c
  15.                if (i == str.length - 1) { & [* @/ x/ {. \& e
  16.                    return true;
      k2 q: n" a3 }6 L& d
  17.                }
    . {! O% d' E: ~4 T5 V* w7 V
  18.                queue.add(i); 1 P5 Z8 V; g* |4 G% [/ t- y
  19.            }
    2 k5 H3 M( I0 v2 w; k, J7 [) \
  20.        }
    9 {* e. g6 F/ j' {4 H6 h; F
  21.        return false;
    ( @( P& d  q) J1 i
  22.    } 1 j8 z9 c3 ?2 i6 x0 t( W6 o) ]
  23. }
复制代码
No.4 石子游戏 VIII
解题思路
看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。
代码展示
  1. class Solution { ) R$ X; h; _( l9 I* w7 x- F
  2.    public int stoneGameVIII(int[] stones) { : {! K; ?! @) A0 @5 S# v0 N2 G4 E
  3.        int n = stones.length; 8 @. i3 f( W8 i- D+ b
  4.        long[] sum = new long[n]; % N3 y. H, P; X
  5.        sum[0] = stones[0];
    . V; R) I7 P8 h- j8 a
  6.        for (int i = 1; i < n; i++) { - U; i2 Z# X) `- _+ E
  7.            sum[i] = sum[i - 1] + stones[i]; , X  H4 j5 m. W; t* k( G
  8.        } . ?' ?. I( E' o- a7 P* p5 Y6 t
  9.        long[] dp = new long[n]; # n) \" G: }( a: X+ s
  10.        dp[n - 1] = sum[n - 1];
    2 Y0 A" v' ^; e
  11.        long max = dp[n - 1]; ( u/ I1 X& T, d% d
  12.        for (int i = n - 2; i > 0; i--) {
    ; y8 y; y4 S' s( e
  13.            dp[i] = sum[i] - max; - J' ]4 R0 C; c* ?& G
  14.            max = Math.max(max, dp[i]); " N8 m8 O5 x6 L
  15.        } 1 b9 Q2 W* \8 b
  16.        return (int) max; $ f  c; r5 n9 d! D% G
  17.    }
    3 @. s) u3 L+ a9 r
  18. }+ R9 B+ M, B9 O  t
复制代码
7 P0 N1 g7 B' g7 ^) y# d# Y
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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