一.题目描述
假设一个单调递增的数组里每个元素都是整数且唯一。
编程实现函数找出数组中任意一个数值等于其下标的元素。例如在数组{-3,-1,1,3,5}中,数字3和下标相等
二.题目解析
1.暴力法遍历
public int find(int[] nums){
/*暴力法,时间复杂度O(n)*/
if(nums == null || nums.length == 0){
return -1;
}
for (int i = 0; i < nums.length; i++) {
if(i == nums[i]){
return nums[i];
}
}
return -1;
}
2.二分法
public int find1(int[] nums){
/*二分法,每次可以把查找范围缩小一半
时间复杂度O(logn)*/
if(nums == null || nums.length == 0){
return -1;
}
int start = 0;
int end = nums.length - 1;
while (start <= end){
int mid = (start + end) >> 1;
//找到一个符合的元素即可返回
if(nums[mid] == mid){
return mid;
}
//由于数组递增则mid和其后元素都不满足
if(nums[mid] > mid){
end = mid - 1;
}else{//由于数组递增则mid和其前元素都不满足
start = mid + 1;
}
}
return -1;
}