给一个升序数组,找到target最后一次出现的位置,如果没出现过返回-1
样例
给出 [1, 2, 2, 4, 5, 5].
target = 2
, 返回 2
.
target = 5
, 返回 5
.
target = 6
, 返回 -1
.
解题思路:
典型的二分法。注意二分变化时,l = mid,而不是l = mid + 1防止本身mid已经指向了最后一次位置而错过。并且注意循环条件l < r - 1,提前退出,最后出现位置要么在r要么在l,先看r再看l,返回结果。
public class Solution {
/**
* @param nums: An integer array sorted in ascending order
* @param target: An integer
* @return: An integer
*/
public int lastPosition(int[] nums, int target) {
// write your code here
if(nums == null || nums.length == 0)
return -1;
if(target < nums[0] || target > nums[nums.length-1])
return -1;
int l = 0, r = nums.length-1;
while(l < r - 1){
int mid = l + (r - l) / 2;
if(nums[mid] > target)
r = mid - 1;
else
l = mid;
}
if(nums[r] == target)
return r;
if(nums[l] == target)
return l;
return -1;
}
}
二刷:
public static int lastPosition(int[] nums, int target) {
// write your code here
if(nums == null || nums.length == 0)
return -1;
if(target < nums[0] || target > nums[nums.length-1])
return -1;
int l = 0, r = nums.length-1;
while(l < r-1){
int mid = l + (r - l) / 2;
if(nums[mid] == target)
l = mid;
else if(nums[mid] > target)
r = mid - 1;
else
l = mid + 1;
}
if(nums[r] == target)
return r;
if(nums[r-1] == target)
return r-1;
return -1;
}