1. 程式人生 > 其它 >Leetcode刷題筆記 330. 按要求補齊陣列

Leetcode刷題筆記 330. 按要求補齊陣列

技術標籤:leetcodeleetcode演算法

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。

現在如果我們將 2 新增到 nums 中, 組合變為: [1], [2], [3], [1,3], [2,3], [1,2,3]。
其和可以表示數字 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. 在這裡我們需要明白什麼時候需要加一個數字,經過自己簡單模擬可以發現
  2. 當陣列中數字可以覆蓋到[1,x-1]時 也就是陣列中的和為x-1時 想要繼續覆蓋x 需要新增數字x是最好的,可以使覆蓋範圍到達[1,2x-1]
  3. 如[1,2,4]這個陣列最多能覆蓋7 想要覆蓋到 8 可以新增8、7、6、4等 但是添加了8 能夠保證新增後 最大的覆蓋範圍為15
  4. 這樣就有初步的思路 一個標記能夠覆蓋的範圍 一個標記陣列的下標
  5. 如果下標對應的數字 <= 能夠覆蓋的範圍 擴大能夠覆蓋的範圍 如[1,2,3] 最大為6
  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的一天哦!