33 Search in Rotated Sorted Array

本文针对LeetCode上的一道经典算法题——在旋转过的有序数组中查找特定元素的问题,提出了一种改进的二分查找法。文章详细介绍了如何根据不同条件调整搜索范围,并给出了简洁高效的代码实现。

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/

题目:

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

解题思路:
看见查找有序两个词,自动脑补二分查找。
但是,这和普通的二分查找不同,已知序列可能为全部有序,或者分两段有序。因而需对二分查找的细节进行修改。

  1. 若 目标值 == nums[mid],返回下标就行
  2. 若 目标值 > nums[mid],分为两种情况
    1. 若 nums[mid] > nums[end],说明在 mid 和 end 之间出现了最大值和最小值的衔接,可以断定比 mid 值大的数都在 mid 右边,start = mid + 1
    2. 若 nums[mid] <= nums[end],说明在 mid 和 end 之间一直都是有序递增的,大于 mid 值的目标值可能在这个序列中,也可能不在(序列中末尾最大的值在序列最前端,例如:7 0 1 2 4 5 6)。这时,我们应该比较目标值与 end 值谁大谁小
      1. 若目标值 > end 值,说明目标值在 mid 值的前面,end = mid - 1
      2. 若目标值 <= end 值,说明目标值在 mid 后面,start = mid + 1
  3. 若 目标值 < nums[mid],由以上可以类推

对以上思路精简一下就是代码了

public class Solution {
    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0)
            return -1;
        int start = 0;
        int end = nums.length - 1;
        while(start <= end) {
            int mid = (start + end) / 2;
            if(target == nums[mid])
                return mid;
            else if(target > nums[mid]) {
                if(nums[mid] <= nums[end] && target > nums[end])
                    end = mid - 1;
                else
                    start = mid + 1;
            } else { // target < nums[mid]
                if(nums[mid] >= nums[start] && target < nums[start])
                    start = mid + 1;
                else
                    end = mid - 1;
            }
        }
        return -1;
    }
}
194 / 194 test cases passed.
Status: Accepted
Runtime: 304 ms

补充:网上搜了一下,发现更快的方法,应该说更加简练,思路大致相同。
参考链接:http://blog.youkuaiyun.com/linhuanmars/article/details/20525681

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值