LeetCode #41 First Missing Positive 缺失的第一个正数

41 First Missing Positive 缺失的第一个正数

Description:
Given an unsorted integer array, find the smallest missing positive integer.

Example:

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

Your algorithm should run in O(n) time and uses constant extra space.

题目描述:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 :

示例 1:

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

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

思路:

此题为408原题
思路是用数组下标当作桶, 进行桶排序
第一次遍历先将 1~nums.size()范围内的元素放在正确的位置
比如 1, 2, 3... 可以用判断 nums[i] == nums[nums[i] - 1]实现
第二次遍历查找是否有不在位置上的元素, 如果有输出 i + 1否则输出数组长度 + 1
时间复杂度O(n), 空间复杂度O(1)

代码:
C++:

class Solution 
{
public:
    int firstMissingPositive(vector<int>& nums) 
    {
        for (int i = 0; i < nums.size(); i++) while (nums[i] > 0 and nums[i] < nums.size() + 1 and nums[i] != nums[nums[i] - 1]) swap(nums[i], nums[nums[i] - 1]);
        for (int i = 0; i < nums.size(); i++) if (nums[i] != i + 1) return i + 1;
        return nums.size() + 1;
    }
};

Java:

class Solution {
    public int firstMissingPositive(int[] nums) {
        for (int i = 0; i < nums.length; i++) while (nums[i] > 0 && nums[i] < 1 + nums.length && nums[i] != nums[nums[i] - 1]) swap(nums, i, nums[i] - 1);
        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;
    }
}

Python:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        def swap(nums: List[int], i: int, j: int) -> None:
            nums[i], nums[j] = nums[j], nums[i]
        for i in range(len(nums)):
            while 0 < nums[i] <= len(nums) and nums[i] != nums[nums[i] - 1]:
                swap(nums, i, nums[i] - 1)
        for i in range(len(nums)):
            if nums[i] != i + 1:
                return i + 1
        return len(nums) + 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容