Leetcode刷題筆記 330. 按要求補齊陣列
阿新 • • 發佈:2020-12-31
330. 按要求補齊陣列
時間:2020年12月29日
知識點:貪心、模擬
題目連結:https://leetcode-cn.com/problems/patching-array/
題目
給定一個已排序的正整數陣列 nums,和一個正整數 n 。從 [1, n] 區間內選取任意個數字補充到 nums 中,使得 [1, n] 區間內的任何數字都可以用 nums 中某幾個數字的和來表示。請輸出滿足上述要求的最少需要補充的數字個數。
示例 1:
輸入: nums = [1,3], n = 6
輸出: 1
解釋:
根據 nums 裡現有的組合 [1], [3], [1,3],可以得出 1, 3, 4。
其和可以表示數字 1, 2, 3, 4, 5, 6,能夠覆蓋 [1, 6] 區間裡所有的數。
所以我們最少需要新增一個數字。
示例 2:
輸入: nums = [1,5,10], n = 20
輸出: 2
解釋: 我們需要新增 [2, 4]。
示例 3:
輸入: nums = [1,2,2], n = 5
輸出: 0
解法:
- 在這裡我們需要明白什麼時候需要加一個數字,經過自己簡單模擬可以發現
- 當陣列中數字可以覆蓋到[1,x-1]時 也就是陣列中的和為x-1時 想要繼續覆蓋x 需要新增數字x是最好的,可以使覆蓋範圍到達[1,2x-1]
- 如[1,2,4]這個陣列最多能覆蓋7 想要覆蓋到 8 可以新增8、7、6、4等 但是添加了8 能夠保證新增後 最大的覆蓋範圍為15
- 這樣就有初步的思路 一個標記能夠覆蓋的範圍 一個標記陣列的下標
- 如果下標對應的數字 <= 能夠覆蓋的範圍 擴大能夠覆蓋的範圍 如[1,2,3] 最大為6
- 如果對應的數字 > 能夠覆蓋的範圍 相當於有空檔 如[1,2,7] 當遍歷到2時 最大的是3 3和7之間有空檔 此時新增4 就可以到達7 最後到達14
程式碼
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
int ans = 0;
long long cover = 0;
int index = 0;
while(1){
if(cover >= n)
break;
// 需要注意的是如何處理連續的陣列 如[1,2,3]
if(index < nums.size() && nums[index] <= cover+1){
cover += nums[index];
index++;
}else{
cover = 2*cover +1;
ans++;
}
}
return ans;
}
};
int main()
{
Solution s;
vector<int> nums{1,2,2};
int n = 5;
cout<<s.minPatches(nums, n)<<endl;
return 0;
}
今天也是愛zz的一天哦!