登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑
) E9 s: v- r9 O7 V
4 I3 Q% H- y1 D5 @8 GNo.1 哪种连续子字符串更长 解题思路 签到题。 代码展示 - class Solution { - u U6 `! T4 U1 M- i
- public boolean checkZeroOnes(String s) { - F1 s# E) G# o
- return check(s, '1') > check(s, '0');
; `4 f# X' q: N0 ?+ U( b - }
, f: V; f; S" [# F) ]+ J - U7 {/ H: ~" i$ r y R
- private int check(String s, char c) { # m3 m$ Y* r& F6 s& O7 U
- int result = 0, count = 0; 1 s2 h2 f5 ^8 e4 K1 U, k' l) w) r
- for (int i = 0; i < s.length(); i++) { " ?6 ~/ T, V# ^2 F$ p: S5 ?& r
- if (s.charAt(i) == c) { ( h5 l+ u* e5 P! U
- count++;
{* V" p/ z. H- r3 y6 i - result = Math.max(result, count);
& H5 j2 q! k9 U. |5 S - } else { 8 Z2 }7 [/ J9 l& W& `
- count = 0; 3 O/ y! u4 t) b, I
- } 5 j9 r) n% s" u
- } ; g |( S3 L8 {; J3 Z6 P0 ~
- return result;
, I+ v* u e- O. U9 @5 ?8 ]8 o - }
0 [0 Z: ^/ o% I. F* G - }
复制代码 g- |* N0 E; v8 u: Z
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。 带刷内容源于Leetcode 原题/近期大厂算法面试真题。 模拟面试+面试技巧分享,备战秋招! 只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动。 活动时间:2021/6/1-2021/6/25 No.2 准时到达的列车最小时速 解题思路 二分答案。 对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。 代码展示 - class Solution {
, d. C; \: \* [6 I! v - public int minSpeedOnTime(int[] dist, double hour) {
8 c2 }4 R D' n5 E7 y6 W - if (!check(dist, hour, (int) (1e7 + 1))) { / l8 T& J, B! ~# P! Z* ?. |
- return -1;
; l' G8 o L" d2 h. k9 H7 x - } # Y4 J- `' ^/ z3 P2 q
- int left = 1, right = (int) 1e7; " h! y& l3 v- }) v5 N
- while (left + 1 < right) {
; Z' e7 H/ a) m* ~8 ~1 z - int mid = (left + right) / 2;
F* ]- n8 P4 K' X - if (check(dist, hour, mid)) { ; f, d% R: d7 F* |' `0 j* C
- right = mid; % e3 r' M# w( a1 s! _9 k- O
- } else { 1 h, T- o+ ^- p
- left = mid; " n; W1 \ C, G0 b% C% s
- }
: d) Q- A- J P8 M+ j. b- S1 ? - }
* K* [4 B0 `6 ^- @4 r) ?1 O/ A4 U6 ] - return check(dist, hour, left) ? left : right; 2 B ~9 v) r. G
- }
- Z. O7 E9 o2 e. N- O9 w# h' u2 ~: y
/ p% @* t+ {! h y- private boolean check(int[] dist, double hour, int speed) { 9 e+ c' ?2 a; q f5 T# S- Q& m( |
- int cost = 0; 8 n" a! C+ @+ q. L1 Q9 H
- for (int i = 0; i < dist.length - 1; i++) { 2 I% I' l6 ?1 a$ |+ c
- cost += (dist[i] + speed - 1) / speed; : e j! M" k# y/ l. w, C; j+ f* P/ e
- }
2 X% x/ c. }' t - return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed); " y4 |6 P8 ^5 [/ s; d h
- }
+ }( c/ X% o1 \0 } n - }
复制代码
2 W8 p" D4 j) j( kNo.3 跳跃游戏 VII 解题思路 类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。 代码展示 - class Solution {
2 M- E3 i6 S0 J1 N _( X9 } - public boolean canReach(String s, int minJump, int maxJump) { % o- h! i- ]9 [& C
- int n = s.length();
1 |% Y# r+ l; [4 S, [- ?3 b - char[] str = s.toCharArray(); , F7 A7 [. ?* z, |
- if (str[n - 1] == '1') {
6 ^. x/ i; Z8 c: W2 C( | - return false; 9 M0 y/ \- I. F1 |! ~
- }
* S. o/ G3 E+ o( W+ b - LinkedList<Integer> queue = new LinkedList<>(); 9 R! k, K+ `3 f n3 o, Q
- queue.add(0); 8 y6 Z C( t4 z: f- {6 D5 a ^8 \
- for (int i = 1; i < str.length; i++) { ! h' Y1 C5 \ N* }8 Q6 |0 ]7 ]
- while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { $ b1 e. g, h$ e2 `1 X
- queue.pollFirst(); $ {' Q# _# p2 ^+ m# v' k% n: F
- } 7 F' {% S" v6 X! k G
- if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
2 s- P! q s5 @: v - if (i == str.length - 1) { I2 y( d( V1 Z# ~3 L+ C
- return true;
) d7 I! P$ _9 ?4 P R - } % t! o' W7 A* b9 H; T- x' H& v5 t% Q
- queue.add(i); 0 q9 i' N; W2 v% [, D1 d1 U* \
- }
8 w5 ], E5 Y4 _4 @ - } 2 Q! {/ T) @7 s8 y; M
- return false;
% q" P9 Y' ?) ]. q* j5 F - }
2 p: w( s) M- p& R" C - }
复制代码No.4 石子游戏 VIII 解题思路 看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。 代码展示 - class Solution {
4 X( u. h1 ^. m- U$ ` - public int stoneGameVIII(int[] stones) {
: ~6 U' f0 f! \( f! G% D' | a - int n = stones.length;
9 B" k5 e: F' I& m E: h. c - long[] sum = new long[n]; & t! s. u1 x4 F8 v
- sum[0] = stones[0];
0 `5 } t" Y8 f* |* } - for (int i = 1; i < n; i++) {
8 \7 w. W* D( M( R" e, } - sum[i] = sum[i - 1] + stones[i];
' Z" l' _! W! a - } 4 W3 r9 u1 L: B( K
- long[] dp = new long[n]; - P# K; m/ {2 ?* D$ C& {5 t* D( P
- dp[n - 1] = sum[n - 1]; 6 |0 E( ]1 ]# @; s
- long max = dp[n - 1]; 4 W( S) P# a- S A9 h
- for (int i = n - 2; i > 0; i--) {
! T5 [' K' M4 t" ` - dp[i] = sum[i] - max; 9 o) X o( g0 ]' ^) f5 X3 W3 x1 g# |
- max = Math.max(max, dp[i]); 2 R9 Y: @1 R2 I1 z: I9 e X
- } 9 {8 @% z1 v% k7 g# G" r5 |# ~
- return (int) max; ) a9 s! I! D% A$ T4 M
- } , P0 ^8 w: ^# j& b
- }. h. r+ _$ b4 m$ j/ L* k0 V
复制代码 , E1 Y5 C$ g* e7 f% P3 F! u
|