leetCode_Patching Array

来源:互联网 发布:mac phpmyadmin 配置 编辑:程序博客网 时间:2024/06/06 18:33

题意:给定一组正整数数组,要组成1——n之间的所有正整数,问最少要补充多少个数

解法1:类似01背包的做法,首先看看不能组成的最小正整数啥多少,然后把这个数加进去,再重复这个步骤。很显然,时间复杂度和空间复杂度都不能满足题意,虽然这也是贪心哈。

解法2:用min表示当前要找的数,i表示和数组中第几个数相比。初始化为min=1,i=0。如果min>nums[i],则min=min+nums[i],i++;如果min==nums[i],则min=min*2;i++;否则就要补充min这个数了,ans++,min=min*2 。我觉得贪心没有一个固定思路,所以难的贪心比简单的动态规划要难很多。加油吧。leetCode的Hard级别的题目都不容易。下午开始线段树。

代码如下:

int minPatches(vector<int>& nums, int n) {    long min=1;    int i=0,ans=0;    while(min<=n)    {        cout<<min<<" "<<i<<endl;        if(i<nums.size()&&min>nums[i])        {            min+=nums[i];            i++;        }        else if(i<nums.size()&&min==nums[i])        {            min=min*2;            i++;        }        else        {            ans++;            min=2*min;        }    }    return ans;}


0 0