首页 > 其他分享 >SearchInRotatedSortedArray

SearchInRotatedSortedArray

时间:2023-04-03 23:14:02浏览次数:33  
标签:target nums SearchInRotatedSortedArray mid && left

package BisectionMethod;

/**
 * 33. 搜索旋转排序数组
 * 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,
 * 使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。
 * 例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为[4,5,6,7,0,1,2] 。
 *
 * 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回-1。
 * 你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
 * 示例
 *  输入:nums = [4,5,6,7,0,1,2], target = 0
 *  输出:4
 * */
/**
 *  1. 首先明白,旋转数组后,从中间划分,一定有一边是有序的。
 *  2. 由于一定有一边是有序的,所以根据有序的两个边界值来判断目标值在有序一边还是无序一边
 *  3. 这题找目标值,遇到目标值即返回
 *  4. 注意:由于有序的一边的边界值可能等于目标值,所以判断目标值是否在有序的那边时应该加个等号(在二分查找某个具体值得时候如果把握不好边界值,可以再每次查找前判断下边界值,也就是while循环里面的两个if注释)
 *
 * */
public class SearchInRotatedSortedArray {
    public static void main(String[] args) {
        int[] arr = {4,5,6,7,8,0,1,2};
        int target = 1;
        int result = search(arr,target);
        System.out.println(result);

    }

    public static int search(int[] nums, int target) {
        int len = nums.length;
        if(len == 0) {
            return -1;
        }
        int left = 0;
        int right = len - 1;
        while(left <= right){
            int mid = (right + left) / 2;
            if(nums[mid] == target){
                return mid;
            }
            // 右边有序
            if(nums[mid] < nums[right]){
                // 目标值在右边
                if(target > nums[mid] && target <= nums[right]){
                    left = mid + 1;
                    // 目标值在左边
                }else{
                    right = mid - 1;
                }
            }else{  // 左边有序
                // 目标值在左边
                if(target >= nums[left] && target < nums[mid]){
                    right = mid - 1;
                    // 目标值在右边
                }else{
                    left = mid + 1;
                }
            }
        }
        return -1;
    }

}

 

标签:target,nums,SearchInRotatedSortedArray,mid,&&,left
From: https://www.cnblogs.com/lipinbigdata/p/17284835.html

相关文章