演算法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陣列
- 演算法學習-第一個缺失的正整數演算法
- 【陣列】1539. 第 k 個缺失的正整數(簡單)陣列
- 查詢正序排列的List中缺失的日期資料的一個演算法演算法
- JS演算法之找出缺失的整數JS演算法
- 41. First Missing Positive(找到陣列中未出現的最小正整數)陣列
- 排序演算法-N個正整數排序排序演算法
- 缺失的數字;及找數字分析
- 找數字續;及缺失的數字分析
- replace()第一個引數是正規表示式第二個是函式用法函式
- DPOS 共識演算法 - 缺失的白皮書演算法
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 41. The Security Namespacenamespace
- 第一個CSS變數:currentColorCSS變數
- 演算法幾個數之和是某個數演算法
- 如何在1到100的整數陣列上找到缺失的數字陣列
- 成為一個PHP專家:缺失的環節PHP
- 實現一個原子的正整數類:AtomicPositiveInteger
- c語言:輸入任意10個正整數,按照升序排序輸出:(冒泡演算法)C語言排序演算法
- apply()第一個引數是nullAPPNull
- BLUP分析中是否包含缺失系譜資訊的個體
- leetcode:確實的第一個整數(java)LeetCodeJava
- 尋找兩個正序陣列中的中位數陣列
- Java判斷一個正整數是不是2的乘方Java
- 用 PHP 在 力扣 刷演算法 [尋找兩個正序陣列的中位數]{有空就更}PHP力扣演算法陣列
- 連續1的個數演算法----C版演算法
- 演算法第四版-找兩個數的最大公約數演算法演算法
- javascript bind()第一個引數以後引數介紹JavaScript
- “數學口袋精靈”App的第一個Sprint計劃APP
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- 第6周-統計正數和負數的個數然後計算這些數的平均值
- Bootstrap系列 -- 41. 帶表單的導航條boot
- 41. 抽卡皮膚的實際邏輯
- 41.部署LNMP平臺原始碼LNMP原始碼
- 用python3求一個正數的因式分解Python
- 4. 尋找兩個正序陣列的中位數陣列
- 正規表示式replace()函式第二個引數$&的作用函式
- 求一個陣列中沒有出現的最小正數陣列