登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑 2 P* z' _, y% c% }
( I3 x3 O% P! y. i8 n
No.1 哪种连续子字符串更长 解题思路 签到题。 代码展示 - class Solution { % e$ d9 `: i3 g
- public boolean checkZeroOnes(String s) { & I+ S- I% Z" C* }' p. ]( E
- return check(s, '1') > check(s, '0'); 4 |5 R$ N: `* K( ~
- } , V% n7 h+ L# x) n7 A
- ( e% z' n, M9 ^1 U8 g
- private int check(String s, char c) { 4 q" [$ |4 d; @; b) ^1 u
- int result = 0, count = 0;
3 S1 O$ J$ g: m7 l7 i. N( T - for (int i = 0; i < s.length(); i++) {
1 v$ I- k# `+ t. w' d7 |3 h+ E - if (s.charAt(i) == c) { 9 P2 X. Q. Q w; f% c7 Q
- count++; ) c8 d+ f; h3 a y- l
- result = Math.max(result, count); # [: P6 s& x* @' F: d' ^6 U
- } else { 5 x$ m* h2 o2 i6 g) H
- count = 0; " l( w' e3 w5 u& }" v9 J" ]' h
- }
p2 {" @/ y6 W6 n - } h# N, r5 B$ ]9 t n& q
- return result;
$ N' x; [) \( H8 ~& I4 k - } . `: s+ e9 u% ?8 ?6 S
- }
复制代码
& M2 G5 ~1 {! ^( \秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。 带刷内容源于Leetcode 原题/近期大厂算法面试真题。 模拟面试+面试技巧分享,备战秋招! 只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动。 活动时间:2021/6/1-2021/6/25 No.2 准时到达的列车最小时速 解题思路 二分答案。 对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。 代码展示 - class Solution { % S6 I. _, ~+ k; X4 t1 z; S0 o
- public int minSpeedOnTime(int[] dist, double hour) { 7 W6 n: H+ }- e1 L
- if (!check(dist, hour, (int) (1e7 + 1))) { + S$ _. Q/ j7 n6 T5 }) M$ G4 E( ~
- return -1;
5 s4 k0 S6 k% Z: f+ P+ d - } & O3 Y4 ~" D& `$ @; G% I' f
- int left = 1, right = (int) 1e7;
) M7 P4 O" o7 M" j. V - while (left + 1 < right) { . S. O9 }" G' u# ]
- int mid = (left + right) / 2;
; C [3 T( ~% R% O! g, |% R - if (check(dist, hour, mid)) { . W( {9 j, `% F) j& G
- right = mid; ) t6 B5 f, I& K7 C, Q
- } else {
- W# L5 Q& Y! n - left = mid; ; R. D9 S& z9 r1 H
- }
" t1 c/ s' \" m - } ' b- h& t- ]. ]% [
- return check(dist, hour, left) ? left : right;
; D. j, N5 h8 q; O - }
; }6 @0 ?+ L; V- w% O6 B& I - 3 y- B3 ]9 i8 _7 S6 t5 P
- private boolean check(int[] dist, double hour, int speed) {
# q2 @& L" V: c0 J7 |% T! H - int cost = 0; + R8 ?+ ~: }- X6 f6 g
- for (int i = 0; i < dist.length - 1; i++) { 7 n- o8 H& U& O+ T5 ]% y* R
- cost += (dist[i] + speed - 1) / speed;
( `. t* P7 v% S0 ^- e6 l - }
) y' d, p7 a7 J! }- X. n/ y+ y - return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
9 X0 {( c& s! c( o$ v# w0 i5 [' W6 a9 S - } ; ~0 d* O5 W d
- }
复制代码 0 ^1 }. k" D, z; ~# f9 Y
No.3 跳跃游戏 VII 解题思路 类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。 代码展示 - class Solution { 2 A% T& D0 J! B; i6 q
- public boolean canReach(String s, int minJump, int maxJump) {
8 v; i1 d4 F4 D: g! b - int n = s.length(); $ ~7 B7 t, q, x" _! v1 G
- char[] str = s.toCharArray(); 5 R, n1 N" y+ Y
- if (str[n - 1] == '1') { 4 C$ {5 M) H" g( S9 w3 T* z! l
- return false; 2 N/ J! s7 i7 R7 @( D9 B
- }
5 K! |3 t! }1 S - LinkedList<Integer> queue = new LinkedList<>();
, p+ M% M' k$ Y$ O$ S ~, H9 B; | - queue.add(0); 0 L( Z: z$ r8 O& l* k
- for (int i = 1; i < str.length; i++) { ! b& a7 O1 y6 R
- while (!queue.isEmpty() && queue.getFirst() + maxJump < i) {
' | s7 G' C3 A) w, m - queue.pollFirst(); 1 K5 |7 z Y* z* F* C8 l
- } % r g9 I( W8 ^6 W5 H( Z1 G
- if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
! V" z x1 N8 I: g - if (i == str.length - 1) { ; h) m" m$ q! k. D P
- return true;
8 T$ u5 Q) M6 C! ~2 l2 `. H1 m$ Z* n - }
$ B7 u5 E4 k$ R/ ]0 L' O: n: s$ F - queue.add(i);
: ^* a$ |% W* M# } `. Y/ l - }
" I7 Z, F( `( p% X( V! s' e2 Y" {: d - } ' O0 h6 U: w4 s! a# @
- return false; 6 r, _# o2 k, K6 w, F
- }
5 |7 v5 u1 ]+ S6 A - }
复制代码No.4 石子游戏 VIII 解题思路 看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。 代码展示 - class Solution {
! K8 q& G& S' |6 V - public int stoneGameVIII(int[] stones) {
! S& O+ u- p$ P; I3 n - int n = stones.length;
9 H' t2 i1 i; ?) w! q9 ^ - long[] sum = new long[n]; / y; l+ R4 C2 r9 j1 p! c. }5 A, F
- sum[0] = stones[0];
! G+ F9 z+ ^* n2 T - for (int i = 1; i < n; i++) { 9 U" A1 e+ Y" }+ R Q/ _
- sum[i] = sum[i - 1] + stones[i];
9 ]( T6 p0 q5 o" `2 M - } $ F) ^6 E0 V% `8 T* W+ _" f
- long[] dp = new long[n]; 2 A' D7 T* \, ]- L$ w. b0 B: Z
- dp[n - 1] = sum[n - 1];
7 d- B) K1 {' k1 ~4 W - long max = dp[n - 1];
* H! e1 y; K2 o, L - for (int i = n - 2; i > 0; i--) { 3 x* v. l/ S* Q4 B# r+ f1 w7 Q- Q& H
- dp[i] = sum[i] - max; 4 G6 c7 V0 J% S+ v. H: {
- max = Math.max(max, dp[i]);
6 T7 g& j6 q C$ } - } 8 A4 P1 D9 [- h& s! }2 n) p$ }
- return (int) max;
* W! S" w0 {; \! o( U1 J - }
( d \7 @, R- v) B) V% D - }6 R' d+ Q- |$ L# o0 }; G
复制代码 k, _+ e7 H3 _- V1 |
|