1. 程式人生 > >LeetCode刷題MEDIM篇 Find First and Last Position of Element in Sorted Array

LeetCode刷題MEDIM篇 Find First and Last Position of Element in Sorted Array

題目

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

十分鐘嘗試

根據時間複雜度可以看出來,利用兩個指標方法,其中漏掉了一些情況:

1 p==q但是當前值不是target

2 迴圈條件不是p<q,因為無法終止,應該是值的比較作為迴圈條件並且p<q

3 if語句裡面,也需要限定p<q,否則比如兩個元素1 5 ,尋找4,一個while迴圈就會出現p>q的情況

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res=new int[2];
        
        if(nums.length==0||target<nums[0]||target>nums[nums.length-1]){
            res[0]=-1;
            res[1]=-1;
            return res;
        }
        int p=0;
        int q=nums.length-1;
        while(p<q&&(nums[p]<target||nums[q]>target)){
            //需要增加p<q,否則1 5尋找4,會出現p>q沒有來得及下次迴圈,本次就導致p>q
               if(p<q&&nums[p]<target){
                    p++;
               }
               if(p<q&&nums[q]>target){
                    q--;
               }    
        }
        //如果相遇,並且不是target就是沒有找到
        if(p==q&&nums[q]!=target){
            res[0]=-1; 
            res[1]=-1;
        }
        else{
            res[0]=p; 
            res[1]=q;
        }
       
        return res;
    }
}

其他解法

很多人利用二分查詢去做,我寫了下面的程式碼,發現有問題,這個是典型的二分查詢程式碼,但是對於5 7 7 8 8 10的輸入,如果找8,返回的是4,不確定是第一個還是最後一個索引。那麼對於二分查詢怎麼確定查詢的是start index還是end index呢?

  private static int search(int[] nums, int target) {
        int index = -1;
        int low = 0;
        int high = nums.length - 1;
        while (low < high) {
            int mid = low + (high - low) / 2;
            if (nums[mid] == target) {
                index = mid;
                return index;
            } else if (nums[mid] > target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;

    }