Google 2016 面试题1 | 数组补丁
来源:互联网 发布:河南省网络培训学院 编辑:程序博客网 时间:2024/06/07 06:18
题目描述
给出一个从小到大排好序的整数数组nums和一个整数n,在数组中添加若干个补丁(元素)使得[1,n]的区间内的所有数都可以表示成nums中若干个数的和。返回最少需要添加的补丁个数。
Example 1:
nums = [1, 3], n = 6
返回1,表示至少需要添加1个数{2},才可以表示1到6之间所有数。
Example 2:
nums = [1, 5, 10], n = 20
返回2,表示至少需要添加两个数{2,4},才可以表示1到20之间所有数。
分析解答
读者不难想到暴力搜索的做法:先穷举每一个不在数组里的数p,再穷举判断p是否可以表示为数组中若干个数的和;如果不能,则把p加入数组中,把答案加一。
然而,这种做法时间复杂度高且实际操作难度大(需要考虑穷举的顺序)。我们不妨先思考一个简单的问题,如果nums数组为空,那么最少需要多少个数字才能表示1到n之间所有数?相信大家都可以想到一个贪心算法,即按照1、2、4、8…都顺序添加,每次加入都数都比之前所有数的总和大1,直到总和大于n。本题的难点是预先给出了一些数,但这不影响我们的贪心策略:假设nums当前至多可以表示1到m之间的所有数,加入m+1;直到m大于等于n。
参考程序
class Solution {public: int minPatches(vector<int>& nums, int n) { int index = 0, res = 0; long sum = 0; while (sum < n) { while (index < nums.size() && nums[index] <= sum + 1) { sum += nums[index++]; } if (sum < n) { res++; sum += sum + 1; } } return res; }};
题目来源
LeetCode 330. Patching Array
1 0
- Google 2016 面试题1 | 数组补丁
- Google 2016 面试题 | 数组补丁
- Google 面试题:数组补丁
- google面试题之数组补丁
- Google 2016面试题
- [数组]面试题1
- Google面试题 07042012 [1]
- Google 2016 面试题6 | Count of Smaller Numbers After Self(数组计数)
- Google 2016 面试题6 | Count of Smaller Numbers After Self(数组计数)
- Google的一个面试题——数组原地置换
- Google的一个面试题——数组原地置换
- Google的一个面试题——数组原地置换
- Google面试题 数组中第K小的数字
- Google面试题 数组中第K小的数字
- 亚马逊面试题1(数组)
- 面试题数组篇(1)
- 面试题--1 数组的几道面试题
- Google面试题 07052012 [1] Circular Queue
- 十分钟看懂数据库——数据库入门级语言总结
- uva 1339 题解
- Java的基础知识6——线程
- 变量的研究
- fseek()函数
- Google 2016 面试题1 | 数组补丁
- ReviewForJob(1)数据结构与算法分析引论
- 适配器模式
- android studio启动debugger时报java.net.NoRouteToHostException "No route to host"
- mysql数据库与oracle数据库中插入sql语句的小区别
- 韦东山嵌入式linux学习笔记
- Educational Codeforces Round 15 C. Cellular Network(二分)
- Java变量的使用注意事项
- MyEclipse优化的方法总结