描述
给一个升序数组,找到target最后一次出现的位置,如果没出现过返回-1
样例
给出 [1, 2, 2, 4, 5, 5].
target = 2, 返回 2.
target = 5, 返回 5.
target = 6, 返回 -1.
代码
public class Solution {
public int lastPosition(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0;
int end = nums.length - 1;
while (start < end -1) {
int mid = start + (end - start) / 2;
if (nums[mid] == target) {
start = mid;
/* 此处只能用start,不能换成end,因为题目要求寻找last position,
* 所以找到了target后还应该判断下后面位置还有没有相同的target数
*/
}
if (nums[mid] > target) {
end = mid;
}
if (nums[mid] < target) {
start = mid;
}
}
if (nums[end] == target) {
return end;
}
if (nums[start] == target) {
return start;
}
return -1;
}
}
经典的二分法模板,不断缩小范围,最后将范围锁定在start和end两个数上,最后通过条件判断语句来确定想要的值。具体细节比如注释地方要根据题目进行修改,若找第一个数就应该用令end = mid