算法作业11

来源:互联网 发布:worktile mac版 编辑:程序博客网 时间:2024/06/05 22:41

题目地址:https://leetcode.com/problems/patching-array/#/description
题目描述:Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.

我的代码

class Solution {public:    int minPatches(vector<int>& nums, int n) {        int s=0,index=0;        long long k=1;        int t=nums.size();        while(k<=n){             if(index>=t||nums[index]>k){                s++;                k=k*2;            }            else {                k+=nums[index++];            }        }        return s;    }};

解题思路
该解法使用贪心。
其原理是加入s个元素并排序得到nums1后,对任意的k,nums1的前i个元素之和是sum[i],[1,sum[i]]中的每个数都可以写成nums1的前i个元素中任意个之和。
首先证明其结果符合题意,代码中,k即为sum[i]+1;直到k>n才结束循环。可知最后的结果是[1,n]中任意的数都可以写成nums1中的任意个元素之和,即如此添加是合理的。
其次证明其添加元素数量最小。一方面,nums1中必须包含1,所以若nums中没有1则一定要添加1。另一方面,加速nums1中的前i个元素是合理而且最小的,那么对第i+1个元素,若nums中的下一个元素是大于sum[i]+1的,那么我们必须添加一个小于等于sum[i]+1的数,否则任何数的和都不等于sum[i]+1,这时添加sum[i]+1可以得到添加其他任何数的效果,所以,显然应该添加sum[i]+1。由此,通过归纳可知,如此添加使元素数量最小。(使其最小并不意味着是唯一方案,除非极端情况,否则可以有很多种添加方法满足题意且添加元素数量与此相同)。
最坏复杂度为O(n).

0 0
原创粉丝点击