LeetCode-704
题目链接:https://leetcode.cn/problems/binary-search/
1.思路:二分查找法。
题干:有序,并且是数组数据结构。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left<=right){
int mid = left + (right - left)/2;
if(target==nums[mid]){
return mid;
}
if(nums[mid] < target){
left = mid +1;
}
if(nums[mid]>target){
right = mid -1;
}
}
return -1;
}
}
2.二分查找使用条件:
1.有序(递增,递减)
2.存储结构为数组
3.二分查找过程:
①首先确定整个查找区间的中间位置mid=(left+right)/2
②用待查关键字值key与中间位置的关键字值进行比较;
若相等,则查找成功;
若大于,则在右半个区域继续进行折半查找;
若小于,则在左半个区域继续进行折半查找;
③对确定的缩小区域再折半查找,重复上述步骤。
最后,得到结果:要么查找成功,要么查找失败。
4.二分查找时间复杂度推导:
总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
由于n/2k取整后>=1,即令n/2k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)
5.二分查找注意点,疑点:(个人疑惑)
1.while 条件中什么时候 left < right ,什么时候 left<=right;
2. right = mid -1 or right = mid;
当right = arr.size 时,用left <right; left = mid +1;right = mid;
当right = arr.size-1 时,用 left <= right ; left = mid +1;right = mid-1;