zoukankan      html  css  js  c++  java
  • [LeetCode] 33. 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。

    平时使用二分法的时候,直接判断中点和目标的关系,就可以知道目标在左半边还是右半边,这需要一个条件,数组有序的。在这题中,因为发生了旋转,原来的数组不在有序。但升序数组旋转后如果左边的点比右边的点小,说明这两个点之间是有序的,不存在旋转点。如果左边的点比右边的大,说明这两个点之间有一个旋转点,导致了不再有序。因为只有一个旋转点,从中间一分为二后,肯定有一半是有序的。所以,我们还是可以用二分法,不过要先判断左半边有序还是右半边有序。如果左半边有序,则直接将目标和左半边的边界比较,就知道目标在不在左半边了,如果不在左半边肯定在右半边。同理,如果右半边有序,则直接将目标和右半边的边界比较,就知道目标在不在右半边了,如果不在右半边肯定在左半边。这样就完成了二分搜索。

    Java: Iteration

    public class Solution {
        public int search(int[] nums, int target) {
            int min = 0, max = nums.length - 1, mid = 0;
            while(min <= max){
                mid = (min + max) / 2;
                if(nums[mid] == target){
                    return mid;
                }
                // 如果左半部分是有序的
                if(nums[min] <= nums[mid]){
                    if(nums[min] <= target && target < nums[mid]){
                        max = mid - 1;
                    } else {
                        min = mid + 1;
                    } 
                // 如果右半部份是有序的
                } else {
                    if(nums[mid] < target && target <= nums[max]){
                        min = mid + 1; 
                    } else {
                        max = mid - 1;
                    }
                }
            }
            // 不满足min <= max条件时,返回-1
            return -1;
        }
    }
    

    Java: Recursion

    public class Solution {
        public int search(int[] nums, int target) {
            return helper(nums, 0, nums.length - 1, target);
        }
        
        public int helper(int[] nums, int min, int max, int target){
            int mid = min + (max - min) / 2;
            // 不满足min <= max条件时,返回-1
            if(min > max){
                return -1;
            }
            if(nums[mid] == target){
                return mid;
            }
            // 如果左半部分是有序的
            if(nums[min] <= nums[mid]){
                // 如果在左半部分的边界内
                if(nums[min] <= target && target < nums[mid]){
                    return helper(nums, min, mid - 1, target);
                // 如果不在左半部分的边界内
                } else {
                    return helper(nums, mid + 1, max, target);
                }
            // 如果右半部份是有序的
            } else {
                // 如果在右半部分的边界内
                if(nums[mid] < target && target <= nums[max]){
                    return helper(nums, mid + 1, max, target);
                // 如果不在右半部分的边界内
                } else {
                    return helper(nums, min, mid - 1, target);
                }
            }
        }
    }
    

    类似题目:

     [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II

    [LeetCode] 153. Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值

    All LeetCode Questions List 题目汇总

      

      

  • 相关阅读:
    [转]Torch是什么?
    去掉 CONSOLE 窗口(转)
    最短路径问题
    最短路,dijstra算法
    最短路,floyd算法,图的最短路径
    freckles
    还是畅通工程,最小生成树kruskal
    More is better
    畅通工程
    人见人爱
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8537301.html
Copyright © 2011-2022 走看看