Leetcode_33_搜索旋转排序数组_二分

这篇博客讨论了如何在已知旋转排序数组中高效地进行二分查找。作者首先介绍了问题背景,即部分有序的数组在旋转后可能造成的查找困难。然后,提供了两种不同的二分查找实现,分别针对不同情况优化了查找过程。第一种方法根据目标值与数组首元素的关系来确定查找范围,第二种方法则通过找到数组的转折点来缩小搜索区域。这两种方法都提高了在旋转排序数组中查找目标值的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,对于有序数组,可以使用二分查找
而这个经过旋转排序的,前后是部分有序的,
我们可以先判断首个元素和target的关系
来确定target是在数组的前后哪个部分

class Solution {
    public int search(int[] nums, int target) {
        int st = 0;
        int ed = nums.length - 1;

        if (target >= nums[0]) {
            while(st<=ed) {
                int mid = (st + ed) / 2;
                if(nums[mid] == target) {
                    return mid;
                }
                if(nums[mid] < nums[0] || target < nums[mid]) {
                    ed = mid - 1;
                } else {
                    st = mid + 1;
                }
            }
        } else {
            while(st<=ed) {
                int mid = (st + ed) / 2;
                if(nums[mid] == target) {
                    return mid;
                }
                if(nums[mid] >= nums[0] || target > nums[mid]) {
                    st = mid + 1;
                } else {
                    ed = mid - 1;
                }
            }
        }
        return -1;
    }
}

2021/8/21 重写

class Solution {
    public int search(int[] nums, int target) {
        int len = nums.length;
        int ans = 0;

        // 二分找出转折点
        int flag = len;
        int l = 1;
        int r = len - 1;
        int mid = 0;
        while (l <= r) {
            mid = (l + r) >> 1;
            if (nums[mid] < nums[mid - 1]) {
                flag = mid;
                break;
            } else if (nums[mid] > nums[0]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }

        // 二分找出值
        if (target >= nums[0]) {
            ans = Arrays.binarySearch(nums, 0, flag, target);
        } else {
            ans = Arrays.binarySearch(nums, flag, len, target);
        }
        return ans >= 0 ? ans : -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值