登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑
- e, T1 M7 t& I1 `
Y$ Z9 J) o9 y, I7 u. rNo.1 哪种连续子字符串更长 解题思路 签到题。 代码展示 - class Solution {
3 w. u$ Q2 T; a3 a9 Q& B% w, X - public boolean checkZeroOnes(String s) { ! \6 L0 j l, J6 f$ v+ X2 G# U
- return check(s, '1') > check(s, '0');
1 r3 N, V! O; @# k+ \ - }
& [1 y1 z+ C/ G1 q
( ^+ P8 Y9 W$ T" H- private int check(String s, char c) {
' }+ w6 q$ Y9 P - int result = 0, count = 0;
( I" {8 f s. i9 [/ x - for (int i = 0; i < s.length(); i++) { , F, q* Z% `0 K+ Q4 i4 O. e8 h, x, N
- if (s.charAt(i) == c) { ; v$ c9 C, U+ B+ a: i3 _; N
- count++; ' P! w" Y2 s# q2 x* I! F0 v
- result = Math.max(result, count); 3 o7 q5 C& V5 Q; R; u& W1 f; |
- } else {
# m) a8 ?4 x' c3 x$ S2 N2 ]" j - count = 0; / M& C; u5 c- ?, \* W
- } * e( O8 ?! h" i/ y6 I% R1 [
- }
9 \/ y" S- ~% M( P - return result;
. n3 z: c. z- j - }
- N1 R; O+ \7 ~ - }
复制代码 9 z0 ]3 {- t- r- J$ U
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。 带刷内容源于Leetcode 原题/近期大厂算法面试真题。 模拟面试+面试技巧分享,备战秋招! 只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动。 活动时间:2021/6/1-2021/6/25 No.2 准时到达的列车最小时速 解题思路 二分答案。 对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。 代码展示 - class Solution { * ^" G& u* n, p& ~
- public int minSpeedOnTime(int[] dist, double hour) { 7 q9 P2 U5 D8 l
- if (!check(dist, hour, (int) (1e7 + 1))) {
6 _) L! A6 K1 L2 L- `: X0 ` - return -1;
0 s& I- s3 H- q. c) S - } l' [! L- o2 @/ ^1 e& V E
- int left = 1, right = (int) 1e7; - O. E; E; b. Z- m
- while (left + 1 < right) {
3 `' X" t g7 e+ r - int mid = (left + right) / 2; 4 g: _8 D# [+ B; s, D
- if (check(dist, hour, mid)) {
3 Q& \, Q' o6 A9 I5 y8 c - right = mid; 2 A8 P# J) T! R( k$ `; y
- } else { 2 U$ Q/ z4 T; ~/ X Q
- left = mid;
2 N- W( G1 @! U3 i O' T. S" |$ G - } . w% t2 c& Z) r3 h; n; h
- } ; C% e- Q" r: X5 E# ^4 ~
- return check(dist, hour, left) ? left : right;
0 x d4 ]( @" L: m) W7 P1 P8 Y+ i% J3 l/ \ - } , Y% ]! a6 e- n7 C
( x# ?! w3 e2 j/ S' _+ [# _5 F2 s& H- private boolean check(int[] dist, double hour, int speed) {
- P0 @: R. T& Y \, s - int cost = 0; 9 W6 Q, y: s& ~0 q/ E+ S8 @
- for (int i = 0; i < dist.length - 1; i++) {
5 W/ P+ e* q$ }4 Y* L% r" S - cost += (dist[i] + speed - 1) / speed;
8 s/ w! h/ V2 j( ^8 U) @6 R* p0 V5 c - } 7 M' E8 z) b( U: X% N
- return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
* Y/ t# }0 b3 z; e0 X9 D - }
" z7 i8 u( N7 R8 ^2 f4 N: N - }
复制代码 2 R! y7 t. I' V2 y6 L3 Q7 ?
No.3 跳跃游戏 VII 解题思路 类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。 代码展示 - class Solution {
6 ?' {; R4 N* \$ I - public boolean canReach(String s, int minJump, int maxJump) {
A) R( j( C. p/ h- M - int n = s.length(); $ o) k6 H, i$ }: N+ [8 H0 C+ O
- char[] str = s.toCharArray(); # n8 U9 Y, @/ w# i6 z9 L
- if (str[n - 1] == '1') {
4 R3 u c2 a& n4 p, c - return false;
$ \) W8 `7 F/ X7 J, ^: }' ^/ b C - } 5 X1 h! r" m" \& _
- LinkedList<Integer> queue = new LinkedList<>();
% s/ ?$ E Y5 H7 H9 G( e7 g B8 B - queue.add(0); 4 s) L; s) ]0 n7 J) m* P6 D9 [
- for (int i = 1; i < str.length; i++) {
- u: V' s- e: m; u4 ~/ A - while (!queue.isEmpty() && queue.getFirst() + maxJump < i) {
7 ^/ Z* E2 A; J; q6 ] - queue.pollFirst(); 6 y5 _5 M8 y& a
- } 8 F( b0 P/ B" O9 T
- if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) { 8 g. Y6 s, T: P% N% X
- if (i == str.length - 1) {
* s3 m% h1 Q+ k$ ^) v - return true;
8 ^9 e) ^ B8 S, k3 o$ g - } 3 x. o! i: R5 }2 i4 k+ M7 a
- queue.add(i); 5 z, H3 P! T% A) n
- } 7 @- A1 v: d) ~
- }
9 l: l" P: t8 v - return false;
6 ^: U4 o3 t! |, e - } - ~2 y. h& ?5 t* i
- }
复制代码No.4 石子游戏 VIII 解题思路 看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。 代码展示 - class Solution {
6 h% h" L& _; M4 R8 u4 x" t - public int stoneGameVIII(int[] stones) {
: s: f" Z& T+ z5 g7 i* b( \ - int n = stones.length; A/ T# P( k) P& e
- long[] sum = new long[n];
2 n, F! `+ ~0 P: {6 Z, Q+ l - sum[0] = stones[0]; & S4 @( A& ?+ z' r7 B! S% w# e. L
- for (int i = 1; i < n; i++) { / v' _4 U) r ^
- sum[i] = sum[i - 1] + stones[i]; {$ L9 N0 q7 e' x6 I7 Q. h
- }
) h* `9 ~7 }/ F+ ~. P0 a; F - long[] dp = new long[n]; 4 r' a1 _* _4 \3 G
- dp[n - 1] = sum[n - 1];
* ~- i6 \, C" T& k! a* E - long max = dp[n - 1];
* ~( Q& v! N; [" C - for (int i = n - 2; i > 0; i--) {
: ~5 i) u2 U5 h - dp[i] = sum[i] - max; ) d8 q% e g9 W7 n
- max = Math.max(max, dp[i]); 5 i W" z+ V9 N, w' ?# E
- }
1 {/ x$ J" k) w5 _3 G |# \* e - return (int) max; . Y& a4 H% @- J5 t4 [
- }
! I$ e8 d) p {3 c2 p( m - }7 ^& ?" o4 D) L6 M: ^, w
复制代码
/ a- [3 v( f7 P! X5 P9 G/ r |