33. Search in Rotated Sorted Array 2019-04-04

方法1.例如4,5,6,7,0,1,2

    首先取中间值,取完中间值之后左右总有一边的是升序的排列,判断target的值是否在这个序列里面,

如果在,直接在这个序列里做二分查找,如果不在,则继续在另外的序列做上诉的判断。

时间复杂度:O(logn).

注意:主要是要时刻注意临界值,什么时候跳出循环要把握好,否则可能陷入死循环。

这道题主要是考验了对二分查找的运用。

class Solution {

    public int search(int[] nums, int target) {

        int mid;

        int start=0,end=nums.length-1;

        int count=-1;

        while(start<=end){

            mid=(start+end)/2;

            if(target==nums[mid]){

                count=mid;

                break;

            }

            if(nums[start]<=nums[mid]){

                if(target>=nums[start]&&target<=nums[mid]){

                    end=mid-1;

                }

                else{

                    start=mid+1;

                }

            }else{

                if(target>=nums[mid]&&target<=nums[end]){

                    start=mid+1;

                }else{

                    end=mid-1;

                }

            }

        }

        return count;

    }

}

方法2:先用二分法找到最小值的坐标,然后再进行二分。


class Solution {

    public int search(int[] nums, int target) {

        int start=0,end=nums.length-1;

        int mid;

        //先找到最小的值的坐标

        while(start<end){

            mid=(start+end)/2;

            if(nums[mid]>nums[end]){

                start=mid+1;

            }else{

                end=mid;

            }

        }

        int min=end;

      // System.out.println(min);

        if(nums.length==0){

            return -1;

        }

        if(target>=nums[0]&&min>0&&target<=nums[min-1]){


            return binaryFind(0,min-1,nums,target); 

        }

        if(target>=nums[min]&&target<=nums[nums.length-1]){

            return binaryFind(min,nums.length-1,nums,target);

        }

        return -1;


    }

    public int binaryFind(int start,int end,int[] nums,int target){

        int mid;

        while(start<=end){

                mid=start+(end-start)/2;

                if(nums[mid]==target){

                    return mid;

                }


                if(target>nums[mid]){

                    start=mid+1;

                }else{

                    end=mid-1;

                }

        }

        return -1;

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。