算法作业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).
- 算法作业11
- 算法设计作业11
- Week 11算法分析作业
- 算法作业
- 算法作业
- 算法作业
- 算法作业
- 算法作业
- 算法作业_6(2017.3.11第三周)
- 【算法作业11】LeetCode 70. Climbing Stairs
- 算法作业_21(2017.5.11第十二周)
- 作业调度算法
- 算法第一次作业
- 算法作业方案
- 算法设计作业;贪心;
- 算法作业记录
- 作业调度算法
- 作业调度算法
- 相关分析
- HDU 2203 JAVA
- 如何组装属于自己的台式电脑
- HDU 2206 JAVA
- 反转二进制数
- 算法作业11
- LeetCode 342.Power of Four
- svm综述
- Deepnet在Ubuntu14下的安装问题解决
- HDU 2399 JAVA
- <P>段落标签</p>设置字体和大小,颜色以及与<font>文本标签</font>
- Linux的find指令
- FSL 1588 PTPD简要分析!
- 内联函数 常量和宏的区别