题目描述
请你编写代码实现一个数组方法,任何数组都可以调用 upperBound()
方法,并返回给定目标数字的最后一个索引。nums
是一个可能包含重复数字的按升序排序的数组。如果在数组中找不到目标数字,则返回-1。
示例 1:
输入:nums = [3,4,5], target = 5
输出:2
解释:目标值的最后一个索引是 2
示例 2:
输入:nums = [1,4,5], target = 2
输出:-1
解释:因为数组中没有数字 2,所以返回 -1。
示例 3:
输入:nums = [3,4,6,6,6,6,7], target = 6
输出:5
解释:目标值的最后一个索引是 5
提示:
1 <= nums.length <= 104
-104 <= nums[i], target <= 104
nums
按升序排序。
进阶:你能编写一个时间复杂度为 O(log n) 的算法吗?
解法
方法一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | declare global {
interface Array<T> {
upperBound(target: number): number;
}
}
Array.prototype.upperBound = function (target: number) {
let left = 0;
let right = this.length;
while (left < right) {
const mid = (left + right) >> 1;
if (this[mid] > target) {
right = mid;
} else {
left = mid + 1;
}
}
return left > 0 && this[left - 1] == target ? left - 1 : -1;
};
// [3,4,5].upperBound(5); // 2
// [1,4,5].upperBound(2); // -1
// [3,4,6,6,6,6,7].upperBound(6) // 5
|
方法二
1
2
3
4
5
6
7
8
9
10
11
12
13 | declare global {
interface Array<T> {
upperBound(target: number): number;
}
}
Array.prototype.upperBound = function (target: number) {
return this.lastIndexOf(target);
};
// [3,4,5].upperBound(5); // 2
// [1,4,5].upperBound(2); // -1
// [3,4,6,6,6,6,7].upperBound(6) // 5
|