二分搜索——返回有序数组中数组值等于下标值的最左位置
2017-06-30 14:55
363 查看
给定一个有序递增数组arr,其中不含有重复元素,请找到满足arr[i]==i条件的最左的位置。如果所有位置上的数都不满足条件,返回-1.
思路:
设置变量值res=-1,表示最后一次找到arr[i]==i的位置,初始值为-1表示没有找到
考虑以下情况,M代表中间位置:
1. arr[0]>N-1,由于整个数组是递增的,所以0~N-1范围内不可能出现arr[i]==i的情况
2. arr[N-1]<0,由于整个数组是递增的,所以0~N-1范围内也不可能出现arr[i]==i的情况
3. 当arr[M]>M时,由于位置的增量严格是1,数组值的增量最少为1,所以在M~N-1之间不可能出现arr[i]==i,只需要在0~M-1的范围上继续二分就可以
4. 当arr[M]<M时,同理,只需要在M+1~N-1的范围上继续二分
5. 当arr[M]=M时,更新res的值,res=M,但是由于我们找的是最左的位置,所以继续在0~M-1的范围上继续二分
public class LeftLocationOfArrayValueEqualsIndex {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1={-2,0,1,3,5,6};
int[] arr2={1,2,3,4,5,6};
int[] arr3={-1,1,2,4,5,6};
int[] arr4={-1,0,1,2,3,5};
int[] arr5={-3,-1,0,5,6,9};
System.out.println(getIndex(arr1));
System.out.println(getIndex(arr2));
System.out.println(getIndex(arr3));
System.out.println(getIndex(arr4));
System.out.println(getIndex(arr5));
}
public static int getIndex(int[] arr) {
if(arr==null||arr.length==0)
return -1;
if(arr[0]>arr.length-1 || arr[arr.length-1]<0) //或 arr[0]>0 || arr[arr.length-1]<arr.length-1
return -1;
int left=0;
int right=arr.length-1;
int res=-1;
while(left<right){
int mid=left+(right-left)/2;
if(arr[mid]>mid)
right=mid-1;
else if(arr[mid]<mid)
left=mid+1;
else{
res=mid;
right=mid-1;
}
}
if(arr[left]==left)
res=left;
return res;
}
}
思路:
设置变量值res=-1,表示最后一次找到arr[i]==i的位置,初始值为-1表示没有找到
考虑以下情况,M代表中间位置:
1. arr[0]>N-1,由于整个数组是递增的,所以0~N-1范围内不可能出现arr[i]==i的情况
2. arr[N-1]<0,由于整个数组是递增的,所以0~N-1范围内也不可能出现arr[i]==i的情况
3. 当arr[M]>M时,由于位置的增量严格是1,数组值的增量最少为1,所以在M~N-1之间不可能出现arr[i]==i,只需要在0~M-1的范围上继续二分就可以
4. 当arr[M]<M时,同理,只需要在M+1~N-1的范围上继续二分
5. 当arr[M]=M时,更新res的值,res=M,但是由于我们找的是最左的位置,所以继续在0~M-1的范围上继续二分
public class LeftLocationOfArrayValueEqualsIndex {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1={-2,0,1,3,5,6};
int[] arr2={1,2,3,4,5,6};
int[] arr3={-1,1,2,4,5,6};
int[] arr4={-1,0,1,2,3,5};
int[] arr5={-3,-1,0,5,6,9};
System.out.println(getIndex(arr1));
System.out.println(getIndex(arr2));
System.out.println(getIndex(arr3));
System.out.println(getIndex(arr4));
System.out.println(getIndex(arr5));
}
public static int getIndex(int[] arr) {
if(arr==null||arr.length==0)
return -1;
if(arr[0]>arr.length-1 || arr[arr.length-1]<0) //或 arr[0]>0 || arr[arr.length-1]<arr.length-1
return -1;
int left=0;
int right=arr.length-1;
int res=-1;
while(left<right){
int mid=left+(right-left)/2;
if(arr[mid]>mid)
right=mid-1;
else if(arr[mid]<mid)
left=mid+1;
else{
res=mid;
right=mid-1;
}
}
if(arr[left]==left)
res=left;
return res;
}
}
相关文章推荐
- 二分查找:在有序数组中搜索大于等于x的数的最小下标
- 二分搜索——在有序数组中找到目标函数出来的最左端的位置
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 折半法(二分)搜索有序数列元素下标及数组传参问题
- 二分查找 基于有序数组 返回下标
- 插入元素到有序数组,二分搜索查找插入位置
- 利用二分收索查找该数在该数组所在的位置,前提是要保证改数组是有序的
- 写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
- c++在数组中查找元素并返回位置下标,统计某元素出现次数程序
- 第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)
- 阿里13年研发笔试题 - 寻找有序数组中元素值等于其下标的所有元素
- .写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)C语言
- 【二分查找】在一个长度未知的数组中查找一个数,返回其下标,时间复杂度O(logn)
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- 折半查找—写代码实现在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.
- 写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
- 在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
- N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置,若找到,则输出其下标值;反之,则输出 “Not be found”
- 写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
- 在有序表中进行二分查找,并返回所查找的数在有序表中的位置