刷题11.12

1 买卖股票的最佳时机II

题目

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。

代码

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length<=1) return 0;
        int cur=0,pre=0;
        int in=-1,out=0;
        int result=0;
        boolean buy=false;
        for(int i=0;i<prices.length-1;i++){
            cur=prices[i+1]-prices[i];
            if(pre<=0 && cur>0){
                in=i;
                buy=true;
            }
            if(pre>=0 && cur<=0){
                out=i;
                if(in!=-1 && buy){
                    buy=false;
                    result+=(prices[out]-prices[in]);
                }
            }
            pre=cur;
        }
        if(buy) result+=prices[prices.length-1]-prices[in];
        return result;
    }
}
//讲解代码
class Solution {
    public int maxProfit(int[] prices) {
        int res=0;
        for(int i=1;i<prices.length;i++){
            res+=Math.max(prices[i]-prices[i-1],0);
        }
        return res;
    }
}

总结

我先自己想了想,写出了代码。然后我去看了看讲解,我似乎抓到了解题的关键,但似乎又被我弄的很复杂。我参考之前一道题写的这个,在极小值买入,在极大值卖出,似乎和讲解又有点不一样o(╥﹏╥)o

2 跳跃游戏

题目

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。

代码

class Solution {
    public boolean canJump(int[] nums) {
        int cover=0;
        if(nums.length==1) return true;
        for(int i=0;i<=cover;i++){
            cover=Math.max(cover,i+nums[i]);
            if(cover>=nums.length-1)
                return true;
        }
        return false;
    }
}

总结

自己最开始没想明白怎么写。
看了讲解后,啊啊啊啊,我是在做贪心算法啊,就没想到哎。

3 跳跃游戏II

题目

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。

代码

class Solution {
    public int jump(int[] nums) {
        if(nums.length==1) return 0;
        int count=1;
        int precover=nums[0],curcover=0;
        for(int i=1;i<nums.length;){
            if(precover>=nums.length-1)
                break;
            while(i<=precover){
                curcover=Math.max(curcover,i+nums[i]);
                i++;
            }
            count++;
            precover=curcover;
        }
        return count;
    }
}
//讲解代码
class Solution {
    public int jump(int[] nums) {
        if(nums.length==1) return 0;
        int count=0;
        int curcover=0,maxcover=0;
        for(int i=0;i<nums.length;i++){
            maxcover=Math.max(maxcover,i+nums[i]);
            if(maxcover>=nums.length-1){
                count++;
                break;
            }
            if(i==curcover){
                curcover=maxcover;
                count++;
            }
        }
        return count;
    }
}

总结

我按照自己的想法,不断改错,终于写出来了。可是看着改完的代码,我开始看不懂了。我的想法就是在这一个覆盖范围内,选出最大的新的覆盖范围,然后count++,并不是让每一步更新cover都加一。但是好多测试用例的错误,删删改改,最后代码这个样子。和讲解代码一个想法,代码多学学怎么写的逻辑清楚。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值