53. 最大子数组和(中等)
思路:简单dp,用一个新的数组统计到当前下表之前的数的和,如果为负则重新开始算和。
存在问题:无
class Solution {
public int maxSubArray(int[] nums) {
int sum[] = new int[nums.length];
int max =sum[0] = nums[0];
for(int i=1;i<nums.length;i++){
if(sum[i-1]<0){
sum[i]=nums[i];
}else {
sum[i] = sum[i-1]+nums[i];
}
if(sum[i]>max){
max = sum[i];
}
}
return max;
}
}
55. 跳跃游戏(中等)
思路:简单dp,逆向判断,如果向后倒,该点跳跃距离可以达到我当前点,就把当前点更新为该点。如果遍历一遍没有到达下标0。
存在问题:
class Solution {
public boolean canJump(int[] nums) {
int last = nums.length-1;
for(int i=nums.length-2;i>=0;i--){
if(nums[i]>=last-i){
last = i;
}
}
if(last==0)return true;
else return false;
}
}
32. 最长有效括号(困难)
思路:用两个栈,一个用于匹配,一个用于存储,存储进去的都是配对好的,直接数')'乘2就行,对于不匹配的')',存储一个'('用以隔离连续正确的。
后续看到题解的dp做法,也要用dp实现一下。
存在问题:提交了好几次,对其情况考虑不足。
// 双栈做法:
class Solution {
public int longestValidParentheses(String s) {
Stack<Character> sta = new Stack();
Stack<Character> save = new Stack();
int count =0;
int it=0;
int max=0;
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(c == '('){
sta.push(c);
save.push(c);
}else if(c == ')'&&!sta.empty()&&sta.peek()=='('){
sta.pop();
save.push(c);
}else if(c == ')'){
save.push('(');
}
}
while(!save.empty()){
if(save.peek()=='('&&it>0){
it--;
}else if(save.peek()=='('){
count=0;
}else if(save.peek()==')'){
count++;
it++;
if(count>max)max = count;
}
save.pop();
}
return max*2;
}
}
// dp做法
class Solution {
public int longestValidParentheses(String s) {
int dp[] = new int[s.length()];
int max=0;
for(int i=1;i<s.length();i++){
if(s.charAt(i)==')'){
if(s.charAt(i-1)=='('){
dp[i]=i-2>=0?(dp[i-2]+2):2;
}else if(i-1-dp[i-1]>=0&&s.charAt(i-1-dp[i-1])=='('){
dp[i]=i-2-dp[i-1]>=0?dp[i-1]+2+dp[i-2-dp[i-1]]:dp[i-1]+2;
}
}
if(dp[i]>max)max = dp[i];
}
return max;
}
}
今天刷题比较少,花了一些时间去找八股文整理的PDF,目前找到三个:JavaGuide的整理(付费)、代码随想录的整理(付费)、图灵学院的整理(免费),开始背八股文。