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]

目标输出:0 常见错误输出为2

输入:[0]

目标输出:1

方法一:遍历

此题我使用的是最简单的遍历思想

将数组中的每一个数组都遍历,同时定义一个自加1的变量和数组遍历的数看是否相等,如果不相等则自加1变量就是缺失的那个数。fang

#include<iostream>
#include<vector>

class Solution {
public:
	int missingNumber(std::vector<int> nums) {
		int start = nums[0];
		if (start != 0) return 0;   //第一个数不为零,则就缺零这个数,直接返回跳出
		for (int i = 0; i <nums.size(); i++) {
			if (start == nums[i]) start++;
			else break;   //当不相等时直接跳出循环
		}
		 return start;   
	}
};

int main() {
	std::vector<int> a = {1,2 };
	class Solution test;
	std::cout<<test.missingNumber(a)<<std::endl;
}

方法二:二分法(利用左右边界)

解题思路:
排序数组中的搜索问题,首先想到 二分法 解决。
根据题意,数组可以按照以下规则划分为两部分。
左子数组: nums[i] = inums[i]=i ;
右子数组: nums[i] \ne inums[i]=i ;
缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素” 。

流程图:

代码实现:

#include<iostream>
#include<vector>

class Solution {
public:
	int  missingNumber(std::vector<int> nums) {
		int start = 0;
		int end = nums.size() - 1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (nums[mid] == mid) start = mid + 1;
			else end = mid - 1; 
		}
		return start;
	}
};

int main() {
	std::vector<int> a = {0,2};
	class Solution test;
	std::cout<<test.missingNumber(a)<<std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值