LeetCode @ Search in Rotated Sorted Array 旋转数组查找

来源:互联网 发布:淘宝大码女装裤子店铺 编辑:程序博客网 时间:2024/05/23 13:02

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.

来源于Code_Ganker:http://blog.csdn.net/linhuanmars/article/details/20525681
1.my_idea:因为是旋转数组,则一定至少有一半是有序的
2."因为rotate,当我们切取一半的时候可能会出现误区,所以要进一步判断。每次迭代中,分三种情况:"
(1)如果target==A[mid],直接返回mid;
(2)如果A[mid]<A[right],那么(mid,right)一定有序;进一步如果target属于有序区间(A[mid],A[right]】,则left=mid+1,否则target在leftHalf,则right=mid-1。

(3)如果A[mid]>=A[right],那么(mid,right)一定无序,既从left到mid有序;进一步如果target属于有序区间【A[left],A[mid]),则right=mid-1,否则在rightHalf,则left=mid+1。

3.每次切掉一半数据,所以算法的时间复杂度是O(logn),空间复杂度是O(1)。

<span style="font-size:12px;">public class Solution {    public int search(int[] A, int target) {        int left=0;        int right=A.length-1;        while(left<=right){            int mid=(left+right)/2;            if(A[mid]==target)   //(1)一定要先写找到的case                return mid;            if(A[mid]<A[right]){ //(2)右边有序                if (A[mid]<target && target<=A[right])//如果在有序区间                    left=mid+1;                else                    right=mid-1;            }            else{                //(3)左边有序                if(A[left]<=target && target<A[mid])//如果在有序区间                    right=mid-1;                else                    left=mid+1;            }        }        return -1;    }}</span>

【后记】这个if判断没有和别的题目统一,所以直接看后面LeetCode二分查找总结就好。


0 0
原创粉丝点击