算法要求
458. 目标最后位置
中文English
给一个升序数组,找到 target 最后一次出现的位置,如果没出现过返回 -1
样例
样例 1:
输入:nums = [1,2,2,4,5,5], target = 2
输出:2
样例 2:
输入:nums = [1,2,2,4,5,5], target = 6
输出:-1
算法的实现思路
1.使用的是二分查找的方法,假设目标的数组为 nums
2.设计start = 0,end = nums[nums.length-1],那么mid = (start + end) /2
3.如果 nums[mid] > target ,表示的 目标 target 在该数组的左边,那么重新定义 end = mid-1
4.如果 nums[mid] < target ,表示的 目标 target 在该数组的右边,那么重新定义 start = mid+1
5.直到 nums[mid] == target的时候,返回mid的值
6.但是,请注意,这一道题目要求的是最后的位置,那么就有可能,当你满足了步骤5,也就是时候 nums[start] == target,但是此时 可能存在 nums[mid] == nums[mid + 1],故此,还需要对mid后面的值进行二分查找。
算法实现
public class LastPosition {
public static int lastPosition(int[] nums, int target) {
if (nums.length == 0 || nums[nums.length - 1] < target || target < nums[0]) {
return -1;
} else if (nums[nums.length - 1] == target) {
return nums.length - 1;
}
int start = 0;
int end = nums.length - 1;
return erfencha(nums, target, start, end);
}
private static int erfencha(int[] nums, int target, int start, int end) {
int mid = (start + end ) / 2;
int result = -1;
if(nums[mid] == target ){
if(target < nums[mid+1]){
return mid;
}else {
// 步骤6的情况在这个地方实现了。
result = erfencha(nums, target, mid+1, end);
// int i = 0;
// while(nums[mid+i] == target){
// i++;
System.out.println(i);
// }
// return mid+i-1;
}
}
if (start < end && nums[mid] < target){
result = erfencha(nums, target, mid+1, end);
}else if(start < end && nums[mid] > target ){
result = erfencha(nums, target, start, mid-1);
}
return result;
}
public static void main(String[] args) {
// int target = 5;
// int target = 2;
// int target = 3;
// int[] nums = new int[] { 1, 2, 2, 2,2,3,4, 5, 5 };
int target = 5;
int[] nums = new int[] {1,2,4,5,5,6,6,6};
int index = lastPosition(nums, target);
System.out.println(index);
}
}