20200827动态规划(1.4键键盘 ) 贪心算法 (2.无重叠区间 3.用最少数量的箭引爆气球)

1.4键键盘
其实就是要么直接输入数字 每次+1 要么复制 复制就看几次了 所以这个得到复制值不断比较即可
不知道为什么我的超出时间限制

class Solution {
public:
    int maxA(int N) {
        vector<int>dp(N+2,0);
        for(int i=1;i<=3;i++){
            dp[i]=i;
        }
        for(int i=4;i<=N;i++){
            int t=3;
            while(i-t>0)
            dp[i]=max(dp[i-1]+1,dp[i]);
            dp[i]=max(dp[i],(t-1)*dp[i-t]);
            t++;
        }
        return dp[N];
    }
};

这是人家的代码(很显然我的思路没任何问题嘛对不对)

class Solution {
public:
    int maxA(int N) {
        vector<int>dp(N+1,0);
       
        for(int i=1;i<=N;i++){
            dp[i]=i;
            for(int j=1;j<i-2;j++){
                dp[i]=max(dp[i],(i-j-1)*dp[j]);
            }
        }
        return dp[N];
    }
};

2.无重叠区间
贪心算法我感觉啥都没有呢 没有任何意义 不就是正常做吗

这道题涉及到一个vector按第二个元素排序问题
写一个函数 排序

class Solution {
public:
    static bool cmp(vector<int>data1,vector<int>data2){
        return data1[1]<data2[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size()==0){
            return 0;
        }
        int res=0;
        sort(intervals.begin(),intervals.end(),cmp);
        int end=intervals[0][1];
        for(int i=1;i<intervals.size();i++){
            if(intervals[i][0]<end){
                res++;
            }
            else{
                end=intervals[i][1];
            }
        }
        return res;
    }
};

3.用最少数量的箭引爆气球
这个就是一道简单的动态规划 区间问题之前已经做过两道了(合并区间和插入区间)
原理相同,就是说如果区间有重叠,就求交集,然后继续向后求交集,直到没有交集数量res就再加1
并以当前的值为temp

自己做的

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.size()==0){return 0;}
        if(points.size()==1){return 1;}
        sort(points.begin(),points.end());
        vector<int> cur=points[0];
        int res=1;
        for(int i=1;i<points.size();i++){
            if(cur[1]>=points[i][0]){
                cur[0]=max(cur[0],points[i][0]);
                cur[1]=min(cur[1],points[i][1]);
            }
            else{
                res++;
                cur=points[i];
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值