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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑
) E9 s: v- r9 O7 V
4 I3 Q% H- y1 D5 @8 G
No.1 哪种连续子字符串更长
解题思路
签到题。
代码展示
  1. class Solution { - u  U6 `! T4 U1 M- i
  2.    public boolean checkZeroOnes(String s) { - F1 s# E) G# o
  3.        return check(s, '1') > check(s, '0');
    ; `4 f# X' q: N0 ?+ U( b
  4.    }
    , f: V; f; S" [# F) ]+ J
  5.   U7 {/ H: ~" i$ r  y  R
  6.    private int check(String s, char c) { # m3 m$ Y* r& F6 s& O7 U
  7.        int result = 0, count = 0; 1 s2 h2 f5 ^8 e4 K1 U, k' l) w) r
  8.        for (int i = 0; i < s.length(); i++) { " ?6 ~/ T, V# ^2 F$ p: S5 ?& r
  9.            if (s.charAt(i) == c) { ( h5 l+ u* e5 P! U
  10.                count++;
      {* V" p/ z. H- r3 y6 i
  11.                result = Math.max(result, count);
    & H5 j2 q! k9 U. |5 S
  12.            } else { 8 Z2 }7 [/ J9 l& W& `
  13.                count = 0; 3 O/ y! u4 t) b, I
  14.            } 5 j9 r) n% s" u
  15.        } ; g  |( S3 L8 {; J3 Z6 P0 ~
  16.        return result;
    , I+ v* u  e- O. U9 @5 ?8 ]8 o
  17.    }
    0 [0 Z: ^/ o% I. F* G
  18. }
复制代码
  g- |* N0 E; v8 u: Z
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。
带刷内容源于Leetcode 原题/近期大厂算法面试真题。
模拟面试+面试技巧分享,备战秋招!
只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动
活动时间:2021/6/1-2021/6/25
No.2 准时到达的列车最小时速
解题思路
二分答案。
对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。
代码展示
  1. class Solution {
    , d. C; \: \* [6 I! v
  2.    public int minSpeedOnTime(int[] dist, double hour) {
    8 c2 }4 R  D' n5 E7 y6 W
  3.        if (!check(dist, hour, (int) (1e7 + 1))) { / l8 T& J, B! ~# P! Z* ?. |
  4.            return -1;
    ; l' G8 o  L" d2 h. k9 H7 x
  5.        } # Y4 J- `' ^/ z3 P2 q
  6.        int left = 1, right = (int) 1e7; " h! y& l3 v- }) v5 N
  7.        while (left + 1 < right) {
    ; Z' e7 H/ a) m* ~8 ~1 z
  8.            int mid = (left + right) / 2;
      F* ]- n8 P4 K' X
  9.            if (check(dist, hour, mid)) { ; f, d% R: d7 F* |' `0 j* C
  10.                right = mid; % e3 r' M# w( a1 s! _9 k- O
  11.            } else { 1 h, T- o+ ^- p
  12.                left = mid; " n; W1 \  C, G0 b% C% s
  13.            }
    : d) Q- A- J  P8 M+ j. b- S1 ?
  14.        }
    * K* [4 B0 `6 ^- @4 r) ?1 O/ A4 U6 ]
  15.        return check(dist, hour, left) ? left : right; 2 B  ~9 v) r. G
  16.    }
    - Z. O7 E9 o2 e. N- O9 w# h' u2 ~: y

  17. / p% @* t+ {! h  y
  18.    private boolean check(int[] dist, double hour, int speed) { 9 e+ c' ?2 a; q  f5 T# S- Q& m( |
  19.        int cost = 0; 8 n" a! C+ @+ q. L1 Q9 H
  20.        for (int i = 0; i < dist.length - 1; i++) { 2 I% I' l6 ?1 a$ |+ c
  21.            cost += (dist[i] + speed - 1) / speed; : e  j! M" k# y/ l. w, C; j+ f* P/ e
  22.        }
    2 X% x/ c. }' t
  23.        return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed); " y4 |6 P8 ^5 [/ s; d  h
  24.    }
    + }( c/ X% o1 \0 }  n
  25. }
复制代码

2 W8 p" D4 j) j( k
No.3 跳跃游戏 VII
解题思路
类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。
代码展示
  1. class Solution {
    2 M- E3 i6 S0 J1 N  _( X9 }
  2.    public boolean canReach(String s, int minJump, int maxJump) { % o- h! i- ]9 [& C
  3.        int n = s.length();
    1 |% Y# r+ l; [4 S, [- ?3 b
  4.        char[] str = s.toCharArray(); , F7 A7 [. ?* z, |
  5.        if (str[n - 1] == '1') {
    6 ^. x/ i; Z8 c: W2 C( |
  6.            return false; 9 M0 y/ \- I. F1 |! ~
  7.        }
    * S. o/ G3 E+ o( W+ b
  8.        LinkedList<Integer> queue = new LinkedList<>(); 9 R! k, K+ `3 f  n3 o, Q
  9.        queue.add(0); 8 y6 Z  C( t4 z: f- {6 D5 a  ^8 \
  10.        for (int i = 1; i < str.length; i++) { ! h' Y1 C5 \  N* }8 Q6 |0 ]7 ]
  11.            while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { $ b1 e. g, h$ e2 `1 X
  12.                queue.pollFirst(); $ {' Q# _# p2 ^+ m# v' k% n: F
  13.            } 7 F' {% S" v6 X! k  G
  14.            if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
    2 s- P! q  s5 @: v
  15.                if (i == str.length - 1) {   I2 y( d( V1 Z# ~3 L+ C
  16.                    return true;
    ) d7 I! P$ _9 ?4 P  R
  17.                } % t! o' W7 A* b9 H; T- x' H& v5 t% Q
  18.                queue.add(i); 0 q9 i' N; W2 v% [, D1 d1 U* \
  19.            }
    8 w5 ], E5 Y4 _4 @
  20.        } 2 Q! {/ T) @7 s8 y; M
  21.        return false;
    % q" P9 Y' ?) ]. q* j5 F
  22.    }
    2 p: w( s) M- p& R" C
  23. }
复制代码
No.4 石子游戏 VIII
解题思路
看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。
代码展示
  1. class Solution {
    4 X( u. h1 ^. m- U$ `
  2.    public int stoneGameVIII(int[] stones) {
    : ~6 U' f0 f! \( f! G% D' |  a
  3.        int n = stones.length;
    9 B" k5 e: F' I& m  E: h. c
  4.        long[] sum = new long[n]; & t! s. u1 x4 F8 v
  5.        sum[0] = stones[0];
    0 `5 }  t" Y8 f* |* }
  6.        for (int i = 1; i < n; i++) {
    8 \7 w. W* D( M( R" e, }
  7.            sum[i] = sum[i - 1] + stones[i];
    ' Z" l' _! W! a
  8.        } 4 W3 r9 u1 L: B( K
  9.        long[] dp = new long[n]; - P# K; m/ {2 ?* D$ C& {5 t* D( P
  10.        dp[n - 1] = sum[n - 1]; 6 |0 E( ]1 ]# @; s
  11.        long max = dp[n - 1]; 4 W( S) P# a- S  A9 h
  12.        for (int i = n - 2; i > 0; i--) {
    ! T5 [' K' M4 t" `
  13.            dp[i] = sum[i] - max; 9 o) X  o( g0 ]' ^) f5 X3 W3 x1 g# |
  14.            max = Math.max(max, dp[i]); 2 R9 Y: @1 R2 I1 z: I9 e  X
  15.        } 9 {8 @% z1 v% k7 g# G" r5 |# ~
  16.        return (int) max; ) a9 s! I! D% A$ T4 M
  17.    } , P0 ^8 w: ^# j& b
  18. }. h. r+ _$ b4 m$ j/ L* k0 V
复制代码
, E1 Y5 C$ g* e7 f% P3 F! u
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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