1. 程式人生 > 實用技巧 >LeetCode 41 缺失的第一個整數

LeetCode 41 缺失的第一個整數

LeetCode41 缺失的第一個整數

題目描述

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

樣例

輸入: [1,2,0]
輸出: 3
輸入: [3,4,-1,1]
輸出: 2
輸入: [7,8,9,11,12]
輸出: 1

演算法分析

畫個圖可能好理解一些

思想:使得nums[0] = 1, nums[1] = 2...

  • 遍歷,若他[1,n] , 且nums[i] != i+1這個規律
  • 交換到他因該到的位置 swap(i, nums[i] - 1) 他應該到的位置就是
  • nums[i]應該在nums[i]-1這個位置上

注意:交換的兩個值不能相同哦

時間複雜度

\(O(n)\)

Java程式碼

class Solution {

    static void swap(int[] nums, int a, int b){
        int t = nums[a];
        nums[a] = nums[b];
        nums[b] = t;
    }

    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i = 0; i < n; i ++){
            while(nums[i] > 0 && nums[i] < n && nums[i] != i+1 && nums[i] != nums[nums[i] - 1]){
                swap(nums, i, nums[i] - 1);
            }
        }

        for(int i = 0; i < n; i ++){
            if(nums[i] != i + 1){
                return i+1; //這個位置缺少的那個值就是ans
            }
        }

        return n+1;
    }
}