演算法41. 缺失的第一個正數
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LeetCode 41. 缺失的第一個正數LeetCode
- leetcode:41. 缺失的第一個正數(困難,陣列)LeetCode陣列
- 【陣列】1539. 第 k 個缺失的正整數(簡單)陣列
- JS演算法之找出缺失的整數JS演算法
- DPOS 共識演算法 - 缺失的白皮書演算法
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 41. The Security Namespacenamespace
- 統計輸入的數字為正數和負數的個數
- 如何應對缺失值帶來的分佈變化?探索填充缺失值的最佳插補演算法演算法
- Just for fun——分解一個正整數的質因數
- 41.交換機
- 如何在1到100的整數陣列上找到缺失的數字陣列
- leetcode:確實的第一個整數(java)LeetCodeJava
- 實現一個原子的正整數類:AtomicPositiveInteger
- 正規表示式(匹配第一個花括號)
- 數數的位數(正整數)
- python將輸入的一個正整數分解質因數(map)Python
- c語言:輸入任意10個正整數,按照升序排序輸出:(冒泡演算法)C語言排序演算法
- 正規表示式個位數補零
- 每日一練(25): 0~n-1中缺失的數字
- 數字右邊第一個大於它的數(單調棧)
- 用 PHP 在 力扣 刷演算法 [尋找兩個正序陣列的中位數]{有空就更}PHP力扣演算法陣列
- 用python3求一個正數的因式分解Python
- 尋找兩個正序陣列中的中位數陣列
- BLUP分析中是否包含缺失系譜資訊的個體
- Python:判斷一個正整數是否為迴文數Python
- 演算法第四版-找兩個數的最大公約數演算法演算法
- 41. 抽卡皮膚的實際邏輯
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- 正規表示式replace()函式第二個引數$&的作用函式
- 4. 尋找兩個正序陣列的中位數陣列
- 演算法-兩個排序陣列的中位數演算法排序陣列
- 缺失值填充
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- Double型別數值相加導致精度缺失問題型別
- 洗牌演算法擴充(從n個數中隨機m個數)演算法隨機
- 【刷演算法】二進位制中1的個數演算法
- 一個小小的演算法題:求兩數之和演算法