Google 2016 面试题 | 数组补丁
2016-03-24 17:32
375 查看
Google 2016 面试题 | 数组补丁
题目描述给出一个从小到大排好序的整数数组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。
参考程序
public class Solution { public int minPatches(int[] nums, int n) { long sum = 0; int ans = 0; int index = 0; if (nums.length > 0 && nums[0] == 1) { sum = 1; index = 1; } while (sum < n) { while (index < nums.length && nums[index] <= sum) { sum += nums[index]; index++; } if (sum < n) { if (index < nums.length && nums[index] == sum + 1) index++; else { ans++; } sum = 2 * sum + 1; } } return ans; } }
面试官角度分析
此题的最优算法是贪心。在实际面试过程中,笔者认为只需要想到贪心算法,并给出算法框架,就可以达到hire的程度。能在短时间内完成程序,可以达到strong hire。
相关文章推荐
- Google 2016 面试题2 | 不构造树的情况下验证先序遍历
- Google 2016 面试题 2 | 摆动排序 II
- Google面试题 3| 矩阵中的最长上升路径
- Google 2016 面试题5 | 岛屿计数2
- Google 2016 面试题6 | Count of Smaller Numbers After Self(数组计数)
- Facebook 2016 面试题1 | 递增三元组子序列
- 程序员开发常使用小工具
- 整理 《招聘一个靠谱的iOS》面试题部分参考答案
- 《码农增刊 码农好爸爸》的笔记
- 《码农·码农论剑(第22期)》的笔记
- 操作系统面试题
- 《码农(第12期)》的笔记
- 想知道吗?CTO 比普通程序员强在哪?
- 想知道吗?CTO 比普通程序员强在哪?
- 阿里巴巴面试题
- 数据库面试常问的一些基本概念
- 剑指Offer面试题5——倒序输出一个链表
- 剑指offer面试题6:重建二叉树
- 程序员:让你的腹部瞬间显瘦,只差一个动作!
- 女码农献丑-企业智能机器人客服(图灵机器人)