《剑指Offer——0到n-1中缺失的数字》代码

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——0到n-1中缺失的数字》代码相关的知识,希望对你有一定的参考价值。


前言

//==================================================================
// 《剑指Offer——0到n-1中缺失的数字》代码
// 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
// 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
// 中,请找出这个数字。
//==================================================================


一、示例

示例 1:

输入: [0,1,3]
输出: 2
示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

二、代码解析

1.新建.cpp文件

代码如下(示例):

//==================================================================
// 《剑指Offer——0到n-1中缺失的数字》代码
// 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
// 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
// 中,请找出这个数字。
//==================================================================


#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;

/*哈希表*/
int missingNumber1(vector<int>& nums)
{
	int length = nums.size() + 1;
	unordered_map<int, int> map;

	for (int num : nums)
	{
		map[num]++;
	}

	for (int i = 0; i < length; ++i)
	{
		map[i]++;
		if (map[i] == 1)
		{
			return i;
		}
	}

	return -1;
}

/*数学计算======公式n*(n-1)/2*/
int missingNumber2(vector<int>& nums)
{
	int length = nums.size() + 1;
	int L0 = 0;
	int L1 = length * (length - 1) / 2;
	for (int i = 0; i < length - 1; i++)
	{
		L0 += nums[i];
	}
	return L1 - L0;
}

/*二分查找*/
int GetMissingNumber(vector<int>& nums)
{
	if (nums.empty())
	{
		return -1;
	}
	int left = 0;
	int right = nums.size() - 1;
	while (left <= right)
	{
		int middle = (right + left) / 2;
		if (nums[middle] != middle)
		{
			if (middle == 0 || nums[middle - 1] == middle - 1)
			{
				return middle;
			}
			else
			{
				right = middle - 1;
			}
		}
		else
		{
			left = middle + 1;
		}
	}
	if (left == nums.size())
	{
		return nums.size();
	}
	// 无效的输入,比如数组不是按要求排序的,
	// 或者有数字不在0到n-1范围之内
	return -1;
}

int main()
{
	vector<int> nums = { 0,1,2,3,4,5,6,7,9 };
	cout << "法一-->哈希表-->" << missingNumber1(nums) << endl;
	cout << "法二-->数学计算-->" << missingNumber2(nums) << endl;
	cout << "法一-->二分查找-->" << GetMissingNumber(nums) << endl;
	return 0;
}

2.测试

以上是关于《剑指Offer——0到n-1中缺失的数字》代码的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer面试题53 - II. 0~n-1中缺失的数字

算法剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 Offer-0~n-1中缺失的数字

剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指OFFER----面试题53 - II. 0~n-1中缺失的数字