題意:給定一組正整數數組,要組成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;
}