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