力扣演算法題 41 缺失的第乙個正數 C語言實現

2021-10-25 19:00:35 字數 1313 閱讀 3507

給你乙個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]

輸出: 3

示例 2:

輸入: [3,4,-1,1]

輸出: 2

示例 3:

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

輸出: 1

第一種思路:

1、先進行陣列的排序;排序函式qsort,要避免差值超過返回值範圍的情況;

2、然後找到數字1,j 進行累加判斷,直到陣列和 j 變數不等,跳出迴圈;

第二種思路:

1、通過調換,將陣列中的在value [1,numssize]範圍內的數字移動到nums[value-1]位子上;

2、從頭遍歷陣列,若(下標+1)和值不對應則返回(下標+1);

第三個思路:

通過正負標記,標記對應位置上是否是存在 值=(下標+1);

1、將 0 和負數轉換為 非[1,numsize] 範圍內的數字;

2、獲取資料值的絕對值(絕對值是為了保留值的大小,不可丟失,後面還要判斷),若在value [1,numsize] 範圍內,則將下標為 value-1 對應轉換為 負值,絕對值大小不變;

3、從頭遍歷陣列,若(下標+1)的值為正則返回(下標+1);

int

cmp(

const

void

*a,const

void

*b)elseif(

*(int*

)b <0)

return*(

int*

)a -*(

int*

)b;}

intfirstmissingpositive

(int

* nums,

int numssize)

else

if(iflag)

}return j;

}

int

firstmissingpositive

(int

* nums,

int numssize)

}for

(i=0

;ireturn i+1;

}

int

firstmissingpositive

(int

* nums,

int numssize)

}for

(i=0

;ifor(i=

0;ireturn i+1;

}

力扣41 缺失的第乙個正數

題目描述 給你乙個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。你的演算法的時間複雜度應為o n 並且只能使用常數級別的額外空間。思路 如果沒有時間複雜度和空間複雜度要求,直接排序或者雜湊表均可解決。常數級別的額外空間,則只能在輸入陣列原地交換。若是已排序的陣列,滿足x 對陣列每個元素進行遍...

力扣刷題 41 缺失的第乙個正數

思路 參考了大佬的方法三 將陣列視為雜湊表 整體的思路是每乙個正整數i對應的下標為i 1,通過for及while迴圈將每個正整數交換到正確的位置,然後從第0位開始迴圈查詢,如果出現數 位不匹配則輸出該下標本該對應的正數,即為缺失的第乙個正數。原地雜湊 雜湊函式為 f nums i nums i 1 ...

力扣41 缺失的第乙個正數 題解

給你乙個未排序的整數陣列,請你找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 剛開始,覺得這道題可能要考察時間複雜度,因為正確率只有40 懷疑存在坑導致樣例通不過。寫完 沒想到一遍執行就過了。複雜度還不錯,o n 我使用雜湊表來儲存陣列...