整体思路
改造原数组,将值为
的元素放到下标为
的位置
以下2种情况将元素置0:
元素值超出范围
元素值重复
遍历改造后的数组, 第一个值为0的位置就是未出现的最小正整数
例如数组
,改造后为
,遍历后第一个0下标为
,所以缺失的是
复杂度
遍历2次,时间复杂度
交换法,原地操作, 空间复杂度
import java.util.*;
public class Solution {
/**
* return the min number
* @param arr int整型一维数组 the array
* @return int整型
*/
public int minNumberdisappered (int[] arr) {
int len = arr.length;
// 预处理
for (int i = 0; i < len; i ++) {
// 元素小于0或大于len时,置0
if (arr[i] <0 || arr[i] > len)
arr[i] = 0;
while (arr[i] > 0 && arr[i] <= len && arr[i]!=i+1) {
// 如果arr[i]与下表为arr[i] - 1的元素相等,代表它重复了,保留1个,将其置0
if (arr[i] == arr[arr[i] - 1]) {
arr[i] = 0;
break;
}
// 将元素arr[i]交换到下标为arr[i]-1的位置
swap(arr, i, arr[i] - 1);
}
}
// 遍历查找,元素为0时代表i+1缺失
for (int i = 0; i < len; i ++) {
if (arr[i] == 0)
return i + 1;
}
return len + 1;
}
private void swap (int[] arr, int a, int b) {
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
}


京公网安备 11010502036488号