LeetCode刷題MEDIM篇 Find First and Last Position of Element in Sorted Array
阿新 • • 發佈:2019-01-09
題目
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;
}