1. 程式人生 > >找出第一個缺失的正數

找出第一個缺失的正數

轉載:https://blog.csdn.net/LaputaFallen/article/details/79966835

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3
1
2
Example 2:

Input: [3,4,-1,1]
Output: 2
1
2
Example 3:

Input: [7,8,9,11,12]
Output: 1
1
2
Note: 
Your algorithm should run in O(n) time and uses constant extra space.

問題描述

給定一個未排序的整數陣列,返回最小的缺失正整數

問題分析

若是排好序的正整數陣列,為[1, 2, 3, 4, 5…],即i = n - 1(i為下標,n為元素值)

那麼我們通過將”錯位”的元素通過swap轉換到它對應的位置,然後掃描陣列就可以了

看一個例子,[1, 2, 0]

1已就位,2已就位,0跳過

從左到右掃描陣列,發現只有下標為2處未就位,返回2 + 1,即3

解法

class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length, i = 0;
        /*
        第一個if的三種情況分別為
        nums[i] <= 0, 非正數
        nums[i] == i + 1, 已就位
        nums[i] > len,元素值太大,無法找到合適的位置就位
        第二個表示元素值未就位,通過swap進行替換,歸位
        第三個表示有重複元素,跳過即可
        */
        while(i < len){
            if(nums[i] <= 0 || nums[i] == i + 1 || nums[i] > len)   i++;
            else if(nums[nums[i] - 1] != nums[i])   swap(nums, i, nums[i] - 1);
            else    i++;
        }

        i = 0;
        while(i < len && nums[i] == i + 1)  i++;

        return i + 1;
    }
    public void swap(int[] nums, int a, int b){
        int temp =  nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}