登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
本帖最后由 上岸算法 于 2021-5-25 23:25 编辑 - e8 a9 k2 `# @+ \* u
- {: D3 D' O' G: S$ G
No.1 哪种连续子字符串更长 解题思路 签到题。 代码展示 - class Solution {
9 J! k" m! @/ L/ D6 w- W v1 y9 M: V - public boolean checkZeroOnes(String s) {
+ B" m) s* H5 i9 H - return check(s, '1') > check(s, '0');
: D! M5 |4 q1 H, f$ m) I - } $ T: R6 `, [, G- j2 R4 w* y
; k) b# l' {3 d6 B8 q; a- private int check(String s, char c) {
$ S# c/ G r5 ] - int result = 0, count = 0; ' J3 O9 w1 x+ C
- for (int i = 0; i < s.length(); i++) {
/ \1 B& _0 L7 _# R) y/ [ - if (s.charAt(i) == c) {
6 j; z, `5 N0 H ?/ E - count++; 8 I9 m% |4 A2 t! X- a
- result = Math.max(result, count); ! Z, ~: I! W# ^7 W3 D
- } else { ' |3 |6 n. A9 U- e. N8 j) ^. M! [
- count = 0;
, d) j; a6 D0 z n - }
X5 k9 r# F+ d - } , F0 ^+ c( _; y* Q
- return result; - E4 c( H- `% m- e" ]: R7 S* M
- } ) F7 ^) P9 I( |* \
- }
复制代码
" k$ m7 k+ ]- L秋招将近,华大学长/斯坦福学姐联合组织了一场面向北美2021秋招的算法带刷公益活动。 带刷内容源于Leetcode 原题/近期大厂算法面试真题。 模拟面试+面试技巧分享,备战秋招! 只要你熟练掌握一门计算机语言,比如:java/ python 等,即可免费参与本次刷题活动。 活动时间:2021/6/1-2021/6/25 No.2 准时到达的列车最小时速 解题思路 二分答案。 对于给定车速计算通勤总耗时的时候,建议仅在最后一次运算使用浮点运算,其他均使用整型向上取整的除法。 代码展示 - class Solution { $ n [0 a- z2 C1 p" l
- public int minSpeedOnTime(int[] dist, double hour) { 4 O$ B& e8 `2 B( \: i, C; S
- if (!check(dist, hour, (int) (1e7 + 1))) { ; J+ R7 z8 ?! X) e* H2 V
- return -1; 7 x/ `1 T7 L, ^9 P9 @) ^, ^
- } 3 }/ z# F" n2 n! ~! @! I
- int left = 1, right = (int) 1e7;
9 Z* v* Q0 F& R; i4 N5 s - while (left + 1 < right) { 8 q2 c5 y' B# B5 G: {( M8 }- {9 z
- int mid = (left + right) / 2; 5 J( L4 O8 N8 o) z) q
- if (check(dist, hour, mid)) { # v, [ F, Q" V
- right = mid;
1 x' r' G ^4 k4 J" ~: S7 N! E+ z - } else {
" {8 v) a/ _; Q# c - left = mid;
- k8 F( X) O3 k# p* Z% ?2 E, G* Z1 H - }
' d! B$ r1 O3 a5 A+ U - }
9 ^: j3 I( ^1 y0 b& B/ i - return check(dist, hour, left) ? left : right;
7 w. j- k0 q5 q - }
: d$ `7 Y* w/ E1 M& Z - : ~! [( N' L/ S4 c& O9 O7 x6 j
- private boolean check(int[] dist, double hour, int speed) { , t3 d. Z- q+ j8 R) @7 g
- int cost = 0;
/ }8 H- k2 @9 v% V: ` - for (int i = 0; i < dist.length - 1; i++) { / r& D) H. J9 A" O4 `2 a* ~
- cost += (dist[i] + speed - 1) / speed;
3 j) N6 P( z* s) ? - }
! H/ F6 W' l5 |# c2 T - return hour >= (double) cost + (1.0 * dist[dist.length - 1] / speed);
) _$ a6 Y6 A5 d% } - } 2 p. \8 e" A9 v. @8 U D
- }
复制代码
( h7 v: I& C5 K2 GNo.3 跳跃游戏 VII 解题思路 类似于滑动窗口,使用队列维护可以跳跃到当前点的点集合。 代码展示 - class Solution {
4 e, X" q3 R4 v+ q, W1 ?: k4 Q - public boolean canReach(String s, int minJump, int maxJump) {
9 d& q' i$ I; b' x4 b - int n = s.length(); ! n _8 T' t6 z4 Y
- char[] str = s.toCharArray(); % m. E0 p6 s% n+ i% t
- if (str[n - 1] == '1') {
. J7 {. F# n. z' p - return false; ! c4 U& R+ S: a1 t7 U$ O3 B
- } 4 s8 `8 Y# ]1 a- q
- LinkedList<Integer> queue = new LinkedList<>();
4 i- D% ` T# _7 O! f3 Z - queue.add(0);
; I: c* L# Y2 u5 { Q# l0 b2 Z - for (int i = 1; i < str.length; i++) { / k$ k0 X1 |: ~% p/ }
- while (!queue.isEmpty() && queue.getFirst() + maxJump < i) {
' M& e+ M3 [5 J2 q& ` - queue.pollFirst();
- d$ o8 }1 {% J' w2 g& C9 A& S - } . X7 C/ r# N4 ^3 r
- if (!queue.isEmpty() && str[i] == '0' && queue.getFirst() + minJump <= i) {
6 s, j9 s* f+ P; A - if (i == str.length - 1) {
3 x/ W$ ~3 |- H - return true; , ]! r* M" m" J; |, S& E k$ A% n
- }
: v( B8 r1 b, ] - queue.add(i);
& S( X8 z1 w5 B ]2 H* U5 t - } / f" @. L) w6 k; u: D6 ]" h$ e
- }
# f4 Y# U9 {* w9 q8 d. C8 F% K6 ~2 R - return false;
4 @* C, X I: o0 b5 r: P - } ( @+ ]6 V1 O$ I3 X: d/ `
- }
复制代码No.4 石子游戏 VIII 解题思路 看似每次要重新放回去一个总和石子很复杂,但其实恰相反:放回去的石子必然被对手拿到,因此抵消了自己拿到的和。 代码展示 - class Solution { 8 ]* y0 {) i3 O0 I5 n) X, m p7 E
- public int stoneGameVIII(int[] stones) { / Z! w+ F+ ^& j8 _) Y3 D# P& }
- int n = stones.length;
9 |6 t3 F9 K- g& r9 n - long[] sum = new long[n];
) u9 x/ U% x6 W4 U - sum[0] = stones[0]; / l# q% p. C( d( E3 r8 w
- for (int i = 1; i < n; i++) { 4 q0 T% P, B$ A" @1 n9 [
- sum[i] = sum[i - 1] + stones[i]; & T. Y) `0 {8 U
- } 8 w8 a1 d L( H G' {* p4 k" N @, y
- long[] dp = new long[n];
% ] w( x) `" [0 J+ R5 Z - dp[n - 1] = sum[n - 1];
8 x( ?. a8 g& F6 C% a9 G3 V - long max = dp[n - 1];
* _& l5 b6 {3 h/ v9 ? - for (int i = n - 2; i > 0; i--) {
+ s$ C+ W8 o( K - dp[i] = sum[i] - max;
- U- P( R) ]0 Z) ^ - max = Math.max(max, dp[i]); ) T% U( y* ^: J' {, e" {) `; w$ U
- } 3 @% j! E4 Y7 j7 m
- return (int) max;
) ?0 [/ S6 C/ h+ H - }
i5 C9 S% j* m) Y" X - }2 K, K: \: r8 F' F
复制代码
) |6 ~( U0 w( \( Q X( S |