LeetCode-704

发布于:2022-12-10 ⋅ 阅读:(721) ⋅ 点赞:(0)

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;在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到