java從一個有序數組中找出目標元素在數組中的出現的首次和最後一次位置

從一個有序數組中找出目標元素在數組中的出現的首次和最後一次位置
要求時間複雜度O(logn)

int[] nums={1,2,3,4,5,6,7,8,8,8,8,9,10};

這裏因爲是有序數組所以可以採用二分法來解決,分別找出第一次出現的位置和最後一次出現的位置
選出中間位置開始往兩邊走,不斷的去找與目標元素相同的數的位置,如果沒有則返回-1,有則返回位置下標
需要注意的是在找最後一次出現的時候,中間數的位置mid要+1,對應的邊界也會發生相應變化,要不會越界

package com.evan.springboot.study;

/**
 * @author evanYang
 * @version 1.0
 * @date 2020/5/15 下午 6:05
 */
public class SearchDemo {
    public static void main(String[] args) {
        int[] nums={1,2,3,4,5,6,7,8,8,8,8,9,10};
        int i = searchFirst(nums, 8);
        System.out.println(i);
        int last = searchLast(nums, 8);
        System.out.println(last);
    }

    public static int searchFirst(int nums[],int target){
        int left=0;
        int right=nums.length-1;
        int mid=0;
        while (left<=right){
            mid=(right+left)/2;
            if(target>nums[mid]){
                left=mid+1;
            }else{
                right=mid;
            }
            if(right==left){
                break;
            }
        }
        if (nums[left]!=target){
            return -1;
        }else{
            return left;
        }
    }


    public static int searchLast(int nums[],int target){
        int left=0;
        int right=nums.length-1;
        int mid=0;
        while (left<=right){
            mid=(right+left)/2+1;
            if(target>=nums[mid]){
                left=mid;
            }else{
                right=mid-1;
            }
            if(right==left){
                break;
            }
        }
        if (nums[right]!=target){
            return -1;
        }else{
            return right;
        }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章