LC_二分查找_DAY2

搜索插入位置

在这里插入图片描述

讨论 1

思路

​ 这道题目要求我们在一个已经排好序的数组中查找目标值,如果目标值存在,则返回其下标,否则返回它按顺序插入的位置。由于数组已经排好序,因此我们可以考虑使用二分查找算法,以达到时间复杂度为 O(log n) 的要求。

​ 具体来说,我们可以使用两个指针 left 和 right 分别表示当前查找区间的左右边界。初始时,左边界为 0,右边界为数组长度减 1。然后,我们可以使用 while 循环,每次将查找区间缩小一半,直到找到目标元素或者查找区间为空。

​ 在每次循环中,我们可以计算中间位置 mid,然后判断 nums[mid] 与目标值的大小关系。如果 nums[mid] == target,则直接返回 mid;否则,如果 nums[mid] < target,则目标元素可能在 mid 的右侧,因此更新左边界为 mid + 1;否则,更新右边界为 mid - 1。最终,如果找到了目标元素,则返回其下标;否则返回左边界,即目标元素应该插入的位置。

关键点

​ 计算中间位置:在每次循环中,需要计算中间位置 mid,可以使用 left 和 right 两个指针计算得出,mid = left + (right - left) / 2。

​ 判断目标元素是否存在于数组中:如果找到了目标元素,则返回其下标;否则,返回左边界 left,即目标元素应该插入的位置。如果数组中不存在与目标值相等的元素,最终的 left 变量将指向目标元素应该插入的位置。因此,当返回值为 left 时,可以认为目标值不存在于数组中。

class Solution {
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
}

山脉数组的顶峰索引

在这里插入图片描述

讨论 1

在这里插入图片描述

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int n = arr.length;
        int ans = -1;
        for (int i = 1; i < n - 1; ++i) {
            if (arr[i] > arr[i + 1]) {
                ans = i;
                break;
            }
        }
        return ans;
    }
}

讨论 2

public int peakIndexInMountainArray(int[] A) {
    
    // 1.[定左右]
    int l = 0;
    int r = A.length-1;
	
    // 2.[定区间]
    while (l <= r) {// [l,r]
        // 3.[取中值]
        int mid = l + (r-l)/2;
       
        // 4.[进退]
        if (A[mid+1] > A[mid]) {// 上坡
            l = mid + 1; // [爬坡]
        } else if (A[mid-1] > A[mid]){// 下坡
            r = mid - 1; // [返回坡顶]
        } else {
            return mid;
        }

    }
	
    // 5.[无功而返]
    return -1;

}

mid 放中间 天下分三边,左右裁剪 取中间

mid 放右边 天下分两边,左裁剪来 右缩界!取得最左解

mid 放左边 天下分两边,右裁剪来 左缩界!取得最右解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值