***问题背景:在有序数组nums中寻找目标值target,对于特定的下标i,比较nums[i]和target的大小。
- 如果nums[i]=target,则下标i为所需要查找的下标。
- 如何nums[i]>target,则target只可能在下标i的左侧。
- 如果nums[i]
***基于上述可以使用二分法寻找目标值。其中二分法的时间复杂度为O(log n),空间复杂度为O(1)。
二分查找的做法:
定义查找范围 [left,right],初始查找范围是整个数组,每次取查找范围的中点mid,比较nums[mid]和target值得大小。
- 如果相等,则mid即为所寻求得下标;
- 如果nums[mid]>target,则所查找得上限变为right = mid-1,继续查找;
- 如果nums[mid]
注意:二分查找的条件是范围不为空,即left<=right。如果target在数组中,二分查找可以保证找到target,返回target在数组中的下标。如果target不在数组中,则当left>right时结束查找。
***示例题目:
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
示例代码:
class Solution {
public int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while(low <= high){
int mid = (high-low)/2 + low;//二分,划为两个区域
int num = nums[mid];
// num = target时,要找的下标即为mid;
if(num == target){
return mid;
}else if(numtarget时,说明要找的target的下标在num的左侧,故而将最高点设为原来的high-1
}
}
return -1;//找不到目标值时,返回-1;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)