登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑
3 e$ R" N% b7 W) N- }( Q
/ [ F- y% N/ Y6 t7 S! }$ F, ANo.1 哪种连续子字符串更长 解题思路 签到题。 代码展示 - class Solution {
' E) E' } B& p; x+ V - public boolean checkZeroOnes(String s) {
0 o$ T, ~! ^( O7 e - return check(s, '1') > check(s, '0');
% q/ ]+ S. B2 \+ X - }
% i' X' {$ R, }. d
3 J( j3 e) a4 G; i- e3 C% H1 K- private int check(String s, char c) {
( H. W( W0 c5 N& d7 c' W7 x - int result = 0, count = 0;
" L5 {, W! B/ j$ w4 z - for (int i = 0; i < s.length(); i++) {
# N$ v- a# ^' ]: t - if (s.charAt(i) == c) {
, r7 S) n" {4 m H5 B - count++; 0 q; X5 \' t8 j! ^) `# A
- result = Math.max(result, count); 4 Z- y# R! @4 U
- } else {
) r+ \. u1 _ T0 ?# E. o% P+ \ - count = 0; ( q) J, {2 V* O( H* o0 O c6 N
- }
$ E O# O: G% u. r; F - }
# [. h* i1 R# y# ~ - return result;
' b" x! l% W" t( ^- ^: b - } + b" ~) U2 }4 _4 X
- }
复制代码 ' N# j; i! v9 j0 F8 k L
秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。 带刷内容源于Leetcode 原题/近期大厂算法面试真题。 模拟面试+面试技巧分享,备战秋招! 只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动。 活动时间:2021/6/1-2021/6/25 No.2 准时到达的列车最小时速 解题思路 二分答案。 对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。 代码展示 - class Solution { 4 T+ Q; c0 `) G3 Y/ ^% Z# @5 \
- public int minSpeedOnTime(int[] dist, double hour) { 6 d+ r; {% i7 q! X; A: X8 s# @4 Q! F
- if (!check(dist, hour, (int) (1e7 + 1))) { 0 U$ s! m6 s# x8 _ F. H
- return -1;
5 x" d4 [; t0 e - } ; g$ p3 W6 I6 x- Y; T" b8 d
- int left = 1, right = (int) 1e7;
: |8 x1 w; k- u+ B0 L# @! S - while (left + 1 < right) { , W1 V8 f( r" o6 q( w/ `6 U1 U
- int mid = (left + right) / 2; 7 H" m$ c+ A; r
- if (check(dist, hour, mid)) { $ ?* T4 E/ Z7 Z3 `
- right = mid; 9 T' C+ S, g7 A+ m2 j3 l
- } else {
9 p) d8 D( `3 |$ O6 h* w - left = mid; 2 z9 ~3 B* \5 F& L* ]
- } # M5 [2 q# ]) k; W1 m+ r
- } $ ^ x3 r* G3 V$ _
- return check(dist, hour, left) ? left : right; , i8 c, U( S3 n% u: p1 ?
- } , ~5 R# ^5 ]+ P7 Z7 i
7 c! S" ^: `9 h% C- private boolean check(int[] dist, double hour, int speed) { 7 u- Q- X/ c! d { F0 U
- int cost = 0; " X" W% a8 p7 V! l2 c
- for (int i = 0; i < dist.length - 1; i++) { & A$ D9 Z2 P* U+ M
- cost += (dist[i] + speed - 1) / speed; . V9 u' b2 ?/ ~: C; D
- }
1 G, {/ X; j& d% h1 l* ? - return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
) c D5 D4 F5 q j/ K - }
8 T1 C U7 n% K- w/ o - }
复制代码 / I/ X7 {% [8 b; m' R/ G9 i+ O
No.3 跳跃游戏 VII 解题思路 类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。 代码展示 - class Solution {
* w; I* T; j. W" ], Y5 T# N9 j/ M - public boolean canReach(String s, int minJump, int maxJump) {
# q; E; ?( P7 d+ E2 t - int n = s.length();
1 |; t4 ]8 S% ]7 ] - char[] str = s.toCharArray(); $ b2 O8 e% B9 ?, s
- if (str[n - 1] == '1') {
! O8 a' }( {9 L# l- Y - return false;
- D w: _+ l0 |5 v' d1 r+ k - } . m: ~( x+ D' V( f% a; o1 s' r
- LinkedList<Integer> queue = new LinkedList<>();
1 g1 t3 O# G& B, f, l/ n/ c - queue.add(0); - y* S/ I+ ]$ R& @
- for (int i = 1; i < str.length; i++) { - d1 x! [0 d+ w0 F- ~
- while (!queue.isEmpty() && queue.getFirst() + maxJump < i) { 9 [* \ I! l/ ~9 M
- queue.pollFirst(); ! [ D( I5 W) ?1 x
- }
! y* t, i* h$ g: Y% j! ` - if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
* y3 m' b; x* \, c - if (i == str.length - 1) { & [* @/ x/ {. \& e
- return true;
k2 q: n" a3 }6 L& d - }
. {! O% d' E: ~4 T5 V* w7 V - queue.add(i); 1 P5 Z8 V; g* |4 G% [/ t- y
- }
2 k5 H3 M( I0 v2 w; k, J7 [) \ - }
9 {* e. g6 F/ j' {4 H6 h; F - return false;
( @( P& d q) J1 i - } 1 j8 z9 c3 ?2 i6 x0 t( W6 o) ]
- }
复制代码No.4 石子游戏 VIII 解题思路 看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。 代码展示 - class Solution { ) R$ X; h; _( l9 I* w7 x- F
- public int stoneGameVIII(int[] stones) { : {! K; ?! @) A0 @5 S# v0 N2 G4 E
- int n = stones.length; 8 @. i3 f( W8 i- D+ b
- long[] sum = new long[n]; % N3 y. H, P; X
- sum[0] = stones[0];
. V; R) I7 P8 h- j8 a - for (int i = 1; i < n; i++) { - U; i2 Z# X) `- _+ E
- sum[i] = sum[i - 1] + stones[i]; , X H4 j5 m. W; t* k( G
- } . ?' ?. I( E' o- a7 P* p5 Y6 t
- long[] dp = new long[n]; # n) \" G: }( a: X+ s
- dp[n - 1] = sum[n - 1];
2 Y0 A" v' ^; e - long max = dp[n - 1]; ( u/ I1 X& T, d% d
- for (int i = n - 2; i > 0; i--) {
; y8 y; y4 S' s( e - dp[i] = sum[i] - max; - J' ]4 R0 C; c* ?& G
- max = Math.max(max, dp[i]); " N8 m8 O5 x6 L
- } 1 b9 Q2 W* \8 b
- return (int) max; $ f c; r5 n9 d! D% G
- }
3 @. s) u3 L+ a9 r - }+ R9 B+ M, B9 O t
复制代码 7 P0 N1 g7 B' g7 ^) y# d# Y
|