leetcode做题记录0041

leetcode 0041

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述

参考

一开始想排序来着,但是时间复杂度要求是O(n)就不可能用排序了,然后就不知所措了。

看了B站up主:liweiwei1419的讲解,讲的很好,链接如下:

「力扣」第 41 题:“缺失的第一个正数”视频题解

思路

把每个数放到该有的位置上,比如把3放到nums[2],把5放到nums[4],即将nums[i]与nums[nums[i]-1]进行交换。交换的条件是nums[i]必须在[1,len]之间且nums[nums[i]-1]上的数不为nums[i](一样的就没必要交换了)。

交换之后仍需判断nums[i]能否继续交换。

由于缺失的最小正整数一定是在[1,len+1]之间,我们只需在遍历一次数组,第一个被发现不符合nums[i] == i + 1的即为结果,若全部符合,则返回len+1。

每次交换必有一个数到达了正确位置,所以交换次数不可能超过len次,时间复杂度是O(n),秒啊!

class Solution {
    public int firstMissingPositive(int[] nums) {
		int len = nums.length;
		int temp = 0;
		for (int i = 0; i < len; i++) {
			while (nums[i] > 0 && nums[i] < len + 1 && nums[nums[i] - 1] != nums[i]) {
				temp = nums[nums[i] - 1];
				nums[nums[i] - 1] = nums[i];
				nums[i] = temp;
			}
		}
		for (int i = 0; i < len; i++) {
			if (nums[i] != i + 1) {
				return i + 1;
			}
		}
		return len + 1;
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2052

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/105200260