最小可用id是多少
思路: 开辟一个辅助空间helper,然后第一次i=0~n遍历,将arr[i]<n+1的,在相应的helper进行标记。
再一次i=0~n遍历查看helper[i]是否为0,为0则输出
public class 最小可用id是多少上 {
public static int find3(int[] arr){
int n = arr.length;
int[] helper = new int[n + 1];
for (int i = 0; i < n; i++){
if(arr[i]<n+1)
helper[arr[i]]=1;
}
for(int i = 1; i <= n; i++){
if(helper[i]==0){
return i;
}
}
return n + 1;
}
思路: 用二分递归的方式查看紧密问题。
具体思路:
if(l > r) return l + 1;
边界出口int midIndex = l + ((r - l) >> 1);
//中间下标int q = 求乱序中第k小的数.selectK(arr, l, r, midIndex - l + 1);
//实际在中间位置的值,可以看我另一篇文章,通过求主元来确定中间位置- 重要!
if (q == t)
这个可以直接判断左侧是否紧密还是稀疏!
//优化
public static int find4(int[] arr, int l, int r){
if(l > r)
return l + 1;
int midIndex = l + ((r - l) >> 1); //中间下标
int q = 求乱序中第k小的数.selectK(arr, l, r, midIndex - l + 1); //实际在中间位置的值
int t = midIndex + 1; //期望值
if (q == t){ //左侧紧密
return find4(arr, midIndex + 1, r);
}else { //左侧稀疏
return find4(arr, l, midIndex - 1);
}
}
public static void main(String[] args){
int[] arr = {1,2,3,4,5,8,9,10,11,12};
System.out.println(find4(arr,0,arr.length-1));
}
}