首页 > 编程知识 正文

给定一个未排序的整数数组,找出其中没有出现的最小,给定一个无序的整数数组,找出第一个缺失的正整数

时间:2023-05-04 02:45:42 阅读:184543 作者:1057

题目描述

给定一个无序数组arr,找到数组中未出现的最小正整数

例如arr = [-1, 2, 3, 4]。返回1

arr = [1, 2, 3, 4]。返回5

[要求]

时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)

 

示例1

输入 [-1,2,3,4] 返回值 1 import java.util.*;public class Solution { /** * 原地哈希,把数组中取值在1到n的数放到对应的位置, * 比如1放到0的位置,2放到1的位置,……n放到n-1的位置,然后遍历重置后的数组, * 若i下标位置不是i+1,则i+1就是那个最小的正整数,若1到n位置都对的上, * 说明最小的正整数是n+1。 * @param args */ public int minNumberdisappered (int[] arr) { int len = arr.length; for(int i=0;i<len;i++){ //arr[arr[i]-1] == arr[i]代表数组中元素的hash位置-1后还是arr[i]的为位置 //如:5431 i=1时在while里经历2次循环后变为1 5 3 4 然后i=2 此时arr[arr[i]-1]=arr[2] = arr[2]此时代表arr数组元素3的位置,存放在hash位置也是arr[2],即:不用交换位置 while(arr[i] >=1 && arr[i] <= len && arr[arr[i]-1] != arr[i]){ //交换arr[i]-1和i位置的元素 即按照从小到大顺序 在hash数组中存储元素 swap(arr,arr[i]-1,i); } } for(int j=0;j<len;j++){ if(arr[j]!=j+1){ return j+1; } } //若1到n位置都对的上,说明最小的正整数是n+1 return len+1; } public void swap(int[] arr,int sourcePos,int targetPos){ int temp = arr[sourcePos]; arr[sourcePos] = arr[targetPos]; arr[targetPos] = temp; }}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。