leetcode —— 41. 缺失的第一个正数

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

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

解题思路:

  1. 判断数组中是否存在1,如果没有1则直接返回1,结束;
  2. 如果数组长度为1,同时数组中存在1,则直接返回2,结束;
  3. 将数组中小于1或者大于数组长度length的数变为1;
  4. 根据nums[i]的值将nums[nums[i]]对应的数变为负数,表示数组中存在该正数;因为nums[i]的值可能超过数组边界,因此当nums[i]=length时,使nums[0]变为负数;
  5. 遍历数组,当数组中某一个位置的值为正数,表示数组中缺少该位置值的整数,返回该位置的index,结束;注意nums[0]表示的是数组中是否存在length这个正数;
  6. 如果数组全为负数,则返回length+1,结束;
# Python3
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        if not nums: # 如果数组为空,返回1
            return 1
            
        length = len(nums)  # 计算数组的长度
        if 1 not in nums:  # 如果1不在数组中,返回1
            return 1
        if length == 1:  # 如果1在数组中,同时数组长度为1,则直接返回2
            return 2
            
        for i in range(length):  # 数组中存在1,同时将小于1或者大于数组长度的值变为1
            if nums[i]<=0 or nums[i]>length:
                nums[i] = 1

        # 将nums[i]对应的nums[nums[i]]变为负数,表示nums中存在nums[i]整数
        # 因为nums[i]可能等于length,这超出了数组的范围,因此当nums[i]==length时,令nums[0]变为负数,nums[0]为负数表示数组nums中存在length这个正数
        for i in range(length):
            temp = abs(nums[i])
            if temp == length:
                nums[0] = -abs(nums[0])
            else:  
                nums[temp] = -abs(nums[temp])
        # 遍历数组,从1开始,如果存在nums[i]大于0,则直接返回1
        for i in range(1,length):
            if nums[i] > 0:
                return i
        # 判断nums[0]是否大于零,因为nums[0]为负数表示数组中存在正数length
        # 当nums[0]大于零时,则返回length
        if nums[0]>0:
            return length
        # 如果数组中前length个整数都存在,则返回length+1这个正数
        return length+1
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        if(nums.empty())
            return 1;
        int length = nums.size();
        if(std::find(nums.begin(),nums.end(),1)==nums.end())
            return 1;
        if(length==1)
            return 2;
        for(int i=0;i<length;++i)
        {
            if(nums[i]<=0 || nums[i]>length)
                nums[i] = 1;
        }
        for(int i=0;i<length;++i)
        {
            int temp = abs(nums[i]);
            if(temp<length)
                nums[temp] = -(abs(nums[temp]));
            else
                nums[0] = -(abs(nums[0]));
        }
        for(int i=1;i<length;++i)
        {
            if(nums[i]>0)
                return i;
        }
        if(nums[0]>0)
            return length;
        return length+1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章