【題解】缺失的第一個正數

題目要求
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。

示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1

解題思路
1、先將數組中所有不正常的數字(負數、零或大於數組個數的數)替換成1
2、通過將每個數所指向的下標上的數變成負數,最後遍歷數組找到第一個正數。如果整個數組都沒有正數,就取數組個數的後一位
3、特殊情況,因爲數組中會出現多個重複的數字,所以我們需要先將目標對象取絕對值之後再變負。


力扣編譯器

int firstMissingPositive(int* nums, int numsSize){
//1、我們先遍歷一遍數組,判斷是否有1,有則將負數、零和大於數組個數的數替換成1,否則直接返回1
    int count = 0;
    for(int i = 0; i < numsSize; ++i){
        if(nums[i] == 1)
            count++;
    }
    if(!count++)
        return 1;

    for(int i = 0 ; i < numsSize; ++i){
        if(nums[i] <= 0 || nums[i] > numsSize)
            nums[i] = 1;
    }
//2、繼續遍歷數組,將每個元素的數字指向下標上的元素變成負數
//特殊情況,因爲數組中會有多個重複數字,所以我們要把下標的元素取絕對值再取負
    for(int i = 0; i < numsSize; ++i){
        int index = abs(nums[i]);
        nums[index - 1] = - abs(nums[index - 1]);
    }

//3、遍歷數組,將遇到的第一個正整數的下標 + 1輸出
    for(int i = 0; i < numsSize; ++i){
        if(nums[i] > 0)
            return i + 1;
    }

    return numsSize + 1;
}

本月更新進度 7/15

創作不易,你的點贊是我最大的動力!!!
我們下次再見 end~

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章