LeetCode-0322

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的整理(付费)、代码随想录的整理(付费)、图灵学院的整理(免费),开始背八股文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值