算法-缺失的最小正数

算法-缺失的最小正数

缺失的最小正数

这道算法题是非常经典的一道题了Leetcode-42,问题描述如下:

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1

乍一看上去觉得这道题平平无奇,排个序就知道了,然而事情并没有那么简单,不然他咋能成为一道Hard题的?

这道题一般会要求我们在O(N)时间复杂度完成,要达到这一点,排序就不行了,有同学可能会说,用HashMap啊,当然,用hashMap也是可以的,但是如果要求我们必须要空间O(1)的算法,那就不适用了。使用Hash的的思想没错,不过我们可以原地使用数组实现。

我们只需要把符合数组范围的数据映射到数组中他应该在的位置即可,然后我们从数组的0位置遍历,直到遍历到不符合nums[i]==i+1的位置即可!i+1就是我们需要的值。当然,如果全都符合,那目标值就是数组长度+1了。

	public int firstMissingPositive(int[] nums) {
		for(int i=0;i<nums.length;i++){
			//这里首先要保证将符合数组范围内的数据放入到数组位置
			//nums[i]!=nums[nums[i]-1]这里解释一下,其实就是:nums[i]-1!=i
			while(nums[i]>0&&nums[i]<nums.length&&nums[i]!=nums[nums[i]-1]){
				swap(nums,nums[i]-1,i);
			}
		}
		for(int i=0;i<nums.length;i++){
			if(nums[i]!=i+1){
				return i+1;
			}
		}
		return nums.length+1;//所有数据都归位了
	}

	private void swap(int[] nums,int i,int j){
		int temp=nums[i];
		nums[i]=nums[j];
		nums[j]=temp;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章