2774. 数组上界(二分和双指针)
2025年6月25日小于 1 分钟
2774. 数组上界(二分和双指针)
interface Array<T> {
upperBound(target: number): number
}
/**
* 二分法
* 时间复杂度: O(log n)
* 空间复杂度: O(1) 没有使用额外空间
*/
Array.prototype.upperBound = function (target: number): number {
let left = 0, right = this.length - 1;
let result = -1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (this[mid] === target) {
result = mid;
left = mid + 1; // 向右查找更新更大的索引
} else if (this[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
/**
* 遍历
* 时间复杂度: O(n) 最坏情况下需要遍历整个字符串
* 空间复杂度: O(1) 没有使用额外空间
*/
Array.prototype.upperBound = function(target) {
for(let i = this.length - 1; i >= 0; i--) {
if(target === this[i]) return i
}
return -1;
};
/**
* 双指针遍历
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
Array.prototype.upperBound = function (target): number {
if (this.length == 0) return -1
let i = 0
let l = this.length - 1
let upperIndex = -1
while (i <= l) {
if (this[l] === target) return l
if (this[i] > target) return upperIndex;
if (this[i] === target) {
if (i > upperIndex) upperIndex = i
}
i++;
l--;
}
return upperIndex;
}
/**
* js 数原生方法
* 时间复杂度: O(n) 最坏情况下需要遍历整个字符串
* 空间复杂度: O(1) 没有使用额外空间
*/
Array.prototype.upperBound = function(target) {
return this.lastIndexOf(target);
};