Leetcode 《Go和C++兩兄弟》 20200627 41. 缺失的第一個正數

Go寫的第一道leetcode,我感覺很🦚驕傲哇~

題目

  1. 缺失的第一個正數
    給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]
輸出: 3
示例 2:

輸入: [3,4,-1,1]
輸出: 2
示例 3:

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

提示:

你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。

思路

  • 把每個元素放到自己的位置上,比如1放在index=0的位置,已經處理過的元素值改爲-1
  • 時間複雜度是n,空間複雜度是常數

代碼

go語言

func firstMissingPositive(nums []int) int {
    if len(nums)==0 {
        return 1
    }
    for {
        startIndex := -1
        var curV int
        for i:=0; i< len(nums);i++ {
            if nums[i] < 1 || nums[i] > len(nums) {
                continue 
            }
            if nums[i] != i+1 {
                startIndex = i
                curV = nums[i]
            }
        }
        if startIndex == -1 {
            break
        }
        nums[startIndex] = -1
        for {
            if curV < 1 || curV > len(nums) {
                break;
            }
            temp := nums[curV-1]
            if temp == curV {
                break;
            }
            nums[curV-1] = curV;
            curV = temp;
        }
    }

    for i :=0; i < len(nums); i++ {
        if nums[i] != i+1 {
            return i+1
        }
    }
    return len(nums)+1;
}

c++語言

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        if (nums.size() == 0)
            return 1;
        if (nums.size() == 1)
            return nums[0]==1?2:1;
        while(true) {
            int startIndex = -1;
            int curV;
            for (int i = 0; i < nums.size(); i++) {
                if (nums[i] < 1 || nums[i] > nums.size())
                    continue;
                if (nums[i] != i+1) {
                    startIndex = i;
                    curV = nums[i];
                    break;
                }
            }
            if (startIndex == -1)
                break;
            //cout << startIndex <<  " " << curV << endl;
            nums[startIndex] = -1;
            while (true) {
                if (curV < 1 || curV > nums.size())
                    break;
                int temp = nums[curV-1];
                if (curV == temp)
                    break;
                nums[curV-1] = curV;
                curV = temp;
            }
        }
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] != i+1)
                return i+1;
        }
        return nums.size()+1;
    }
};

debug

  • 忘記第一個找到的startIndex值設置成1
  • 木有考慮極端情況哈哈,nums的大小=0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章