leetCode_Patching Array

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章