面试题 17.19. 消失的两个数字
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
输入: [1]
输出: [2,3]
示例 2:
输入: [2,3]
输出: [1,4]
题解:
感觉像是一道数学题,首先数组的个数为n,因为缺少两个数字,所有总数是n+2,可以通过(n+2+1)*(n+2)/2 算出数组的总和,例:高斯算1+..100的算法;然后减去原数组就可以的到缺失的两个数的和,然后再除以2,得到两个数,这两个数一个大于a/2,一个小于a/2,我们运用同样的算法,首先算出0-a/2的总和再减去原数组中小于a/2的元素,就得到其中一个数,再运用两数之和再减去这个数,就成功的到了这两个数;真的是秒啊啊 啊
class Solution {
public int[] missingTwo(int[] nums) {
int totalLength = nums.length + 2;
int totalSum = ((totalLength + 1) * totalLength) >> 1;
for (int num : nums) totalSum -= num;
int missingHalf = totalSum >> 1;
int missingHalfSum = ((missingHalf + 1) * missingHalf) >> 1;
for (int num : nums)
if (num <= missingHalf)
missingHalfSum -= num;
return new int[] {missingHalfSum, totalSum - missingHalfSum};
}
}
你的文章让我学到了很多知识,非常感谢。 http://www.55baobei.com/LneLfHPsiM.html