题目:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000。
方法一:把值装到桶里最后看看那个桶里没有元素
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int[] mergeArr;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
int[] tempArr = new int[n+1];
int res = 0;
for(int i = 0;i<n;i++){
if(arr[i]>n){
res = n+1;
}
else{
tempArr[arr[i]] = 1;
}
}
for(int i =1;i<=n;i++){
if(tempArr[i] == 0){
System.out.println(i);
return;
}
}
System.out.println(res);
}
}
方法二:找到每次排序确定下来的值,判断该值是否和下标相等 如果相当说明左边的元素都是稠密的连续的就向右边查找,如果不相等说明左边的元素是稀疏的有缺少值就继续向左查找。
import java.util.*;
import java.util.stream.StreamSupport;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int[] mergeArr;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
int res = dfs(arr,0,n-1);
System.out.println(res);
}
public static int dfs(int[] arr,int l,int r){
if(l<r){
int mid = l+((r-l)>>1);
int midIndex = -1;
if(arr[l]<=arr[mid] && arr[l]>=arr[r]){
midIndex = l;
}
else if(arr[r]<=arr[mid] && arr[r]>=arr[l]){
midIndex = r;
}
else midIndex = mid;
swap(arr,l,midIndex);
int i = l+1,j = r,k = mid-l+1;
while(i<=j) {
while (i <= r && arr[i] <= arr[l]) i++;
while (j > l && arr[j] > arr[l]) j--;
if(i<=j){
swap(arr,i,j);
i++;j--;
}
}
swap(arr,l,j);
System.out.println(Arrays.toString(arr));
//System.out.println(j);
if(arr[j] == j+1){
return dfs(arr,j+1,r);
}
else
return dfs(arr,l,j-1);
}
if(arr[l] == l+1){
return l+2;
}
else{
return l+1;
}
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}
}