Missing Number

本文介绍了一种线性时间和常数空间复杂度的算法来解决寻找数组中缺失数字的问题。通过使用哈希表,并对数组进行一次遍历,实现将每个元素放置到其正确的索引位置上。之后再次遍历数组找到索引与值不匹配的元素,从而确定缺失的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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

For example,
Given nums = [0, 1, 3] return 2.

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

解题思路:

使用hash table,以数组的索引为key,value和key相同,即nums[i]=i。

首先遍历一遍数组nums,可能遇到的情况及其处理方法如下:

(1)如果nums[i]=i,直接++i,处理数组中的下一个元素

(2)如果nums[i]!=i,这又可以分为两种情况1)nums[i]<nums.size(),交换nums[i]和nums[nums[i]],即把nums[i]放到正确的位置,然后继续处理新的nums[i];2)nums[i]>=nums.size(),直接++i,即跳过该元素,因为此时数组中没有位置使nums[nums[i]]=nums[i]

然后遍历处理后的数组nums,遇到nums[i]!=i的返回i即为所要求的元素


AC代码如下:

class Solution {
public:
	int missingNumber(vector<int>& nums) {
		int n = nums.size();
		if (n == 0) return 0;
		for (int i = 0; i < n;){
			if (nums[i] != i){
				if (nums[i] < n){
					int tmp = nums[nums[i]];
					nums[nums[i]] = nums[i];
					nums[i] = tmp;
				}
				else{
					++i;
				}
			}
			else{
				++i;
			}
		}
		for (int i = 0; i < n; ++i){
			if (nums[i] != i) return i;
		}
		return n;
	}
};

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值