題目要求
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 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~