bigpotato

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

 

一个包含n个元素的整数数组,其元素取值范围为0~n,且不含相同的元素,查找其中不存在的数(0~n)。要求线性时间复杂度和常数空间复杂度。

分析:数组元素取值为0~n之间的数,且除了所求缺失的数外其他数均存在。

法一:可用一个简单的标记法来得出,即用一个包含0~n共n+1个元素的数组来标记,存在的数记为1,不存在记为0,遍历这个数组,值为0的元素的数组下标即为缺失的数。

代码如下:

    int missingNumber(vector<int>& nums) {
  	int length = nums.size() + 1;
	int result = 0;
	vector<int> flags(length, 0);
	for (int i = 0; i < length - 1; i++)
		flags[nums[i]] = 1;
	for (int i = 0; i < length; i++)
	{
		if (flags[i] == 0)
		{
			result = i;
			break;
		}
	}
	return result; 
}

法二:可求出0~n共n+1个整数的和,并求出原数组所有元素的和,前者与后者之差即为缺失的数。

代码如下:

    int missingNumber(vector<int>& nums) {
	long long sum = 0;
	for (int num : nums)
		sum += num;
	int n = nums.size();
    long long total=n*(n+1)/2;
	return (int)(total-sum);
    }

  

 

posted on 2018-03-19 09:11  bigpotato  阅读(115)  评论(0)    收藏  举报