面试:数组: 首个正数

来源:互联网 发布:什么是网络超市? 编辑:程序博客网 时间:2024/06/08 03:28

题目

给定一个无序的整型数组,找出第一个不在数组里的正整数。要求时间复杂度是 O (n),空间复杂度是O(1)

  • 例子
    输入数组{5,3,-1,1}
    返回 2

算法

  1. 借助哈希思想
  2. 数组小标存储相应的值: A[K-1]=K
  3. 对于大于数组长度和小于1的数字抛弃;
  4. 有了新数组就从头开始,遇到第一个A[k-1] 不等于k的,则输出k
  5. 如果没有遇到只能是数组长度的下一个整数
    {1,2,3,4} ;则返回5

import java.util.*;class Solution{    public int firstMissingPositive(int[] A){        int n=A.length;        for(int i=0;i<n;++i){            if(A[i]>0 && A[i]<=n){                if(A[i]-1 !=i && A[A[i]-1]!=A[i]){                    // 交换相应的值                    int temp=A[A[i]-1];                    A[A[i]-1]=A[i];                    A[i]=temp;                    // 交换后还需要对新的A[i] 重新判断                    i--;                }            }        }        for(int i=0;i<n;++i)            //输出第一个不匹配的数字            if(A[i]-1 !=i)                return i+1;        //若未找到        return n+1;    }}
0 0