34. Find First and Last Position of Element in Sorted Array 2019-04-08

1.自己写的方法,先用二分查找找出target对应的数组下标,然后再向前后找临界值。

时间复杂度:最好的情况下为O(logn)

                      最坏的情况下为O(n)

代码:

class Solution {

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

        int mid=binarySearch(nums,target);

      // System.out.println(mid);

        int start=mid;

        int end=mid;

        if(mid==-1){

              int[] result={-1,-1};

              return result;

        }else{

            for(int i=mid;i>=0;i--){

                if(i-1>=0){

                    if(nums[i-1]!=nums[i]){

                        start=i;

                        break;

                    }

                }else{

                    start=i;

                    break;

                }

            }

            if(mid-1<0){

                start=mid;

            }

            for(int i=mid;i

                if(i+1<=nums.length-1){

                    if(nums[i]!=nums[i+1]){

                        end=i;

                        break;

                    }

                }else{

                    end=i;

                    break;

                }

            }

            if(mid+1==nums.length){

                end=mid;

            }

            int[] result={start,end};

            return result;

        }

}

    public static int binarySearch(int[] nums,int target){

        int start=0;

        int end=nums.length-1;

        int mid;

        while(start<=end){

            mid=(start+end)/2;

            if(nums[mid]==target){

                return mid;

            }

            if(nums[mid]>target){

                end=mid-1;

            }else{

                start=mid+1;

            }

        }

        return -1;

    }

}

2.优化版本

    方法:可以直接用二分查找直接找到对应target在数组中最坐边的下标值。

                然后target++;

                再用二分查找找到target对应的下标值

    时间复杂度:最好和最差都是O(logn)

     考察点:这个题目主要是考察了对二分查找的进一步的运用

        代码:

class Solution {

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

        int mid=binarySearch(nums,target);

        if(mid<0||mid>=nums.length||nums[mid]!=target){

            return new int[]{-1,-1};

        }

        target++;

        int end=binarySearch(nums,target);

        if(end==nums.length-1&&nums[end]==target-1){

            return new int[]{mid,end};

        }else{

            return new int[]{mid,end-1};

        }   

    }

    //直接用二分查找找到对应target值最左边的数组下标值

    public static int binarySearch(int[] nums,int target){

        int start=0;

        int end=nums.length-1;

        int mid;

        int exit=-1;

        while(start

            mid=(start+end)/2;

            if(nums[mid]>=target){

                end=mid;

            }else{

                start=mid+1;

            }

        }

        return start;

    }



        

你可能感兴趣的:(34. Find First and Last Position of Element in Sorted Array 2019-04-08)