演算法41. 缺失的第一個正數

orastar發表於2020-05-21

1. 題目描述

給你一個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
提示:
你的演算法的時間複雜度應為O(n),並且只能使用常數級別的額外空間。

2. 解題思路

/*
解題思路:
1、第一個正數為:大於0的整數,如1、2、3、4、5...
2、將數字放到正確的位置: nums[i]:儲存在下標為nums[i]-1位置,不符合該規則的跳過
3、遍歷陣列返回第一個: nums[i]!=i+1的數,為缺失的第一個正數,否則返回numsSize+1
*/

3. 測試結果

4. 解法1

int firstMissingPositive(int* nums, int numsSize) {
    //mid臨時變數用於資料交換
    int mid = 0;
    //遍歷nums陣列
    for (int i = 0; i < numsSize; i++)
    {
        //將 nums[i]:儲存在下標為nums[i]-1位置,不符合該規則的跳過
        while ((nums[i] > 0) && (nums[i] < numsSize + 1) && (nums[i] != nums[nums[i] - 1])) {
            mid = nums[i];
            nums[i] = nums[mid - 1];
            nums[mid - 1] = mid;
        }
    }
    //設定返回值變數res,如果所有值位置都正確,則返回numsSize+1
    int res = numsSize + 1;
    //遍歷陣列,返回第一個位置不正確的數
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] != i + 1) {
            res = i + 1;
            break;
        }
    }
    return res;
}

5. 複雜度分析

時間複雜度:O(n)
空間複雜度:O(1)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2693613/,如需轉載,請註明出處,否則將追究法律責任。

相關文章