找出陣列中沒有出現的最小正整數
阿新 • • 發佈:2019-02-05
題目描述:
給定一個無序整型陣列arr,找到陣列中未出現的最小整數
例子
arr=[-1,2,3,4] return 1
arr=[1,2,3,4] return 5
時間複雜度O(n) 空間複雜度O(1)
解題思路: (1) arr為整數1,2,3…N的一個隨機排列,那個未出現的最小正整數就是N+1。(2) arr中有小於1或者大於N的數出現(我們稱之為“不合法”的數),則未出現的最小正整數一定在1到N中間(因為陣列一共只有N個數,如果出現不合法的數,則出現的1到N之間的數的個數一定小於N,故一定有沒有出現的數)。
實現函式
int missNum(vector< int> nums)
{
int l = 0; // 1-l 已經有
int r = nums.size(); // l+1-r想要有
while (l < r)
{
if (nums[l] == l + 1)
{
l++;
}
// nums[l] 減去 1 表示數nums[l] 應該在的位置
else if (nums[l] < l + 1 || nums[l] > r || nums[nums[l] - 1] == nums[l])
{
r--;
nums[l] = nums[r];
}
else {
swap(nums[l], nums[nums[l] - 1]);
}
}
return l + 1;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22