原題鏈接:
https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/
解題思路:
- 根據(jù)題意,在給定
x的情況下,y是單調(diào)遞增的 - 因此,我們可以從
1到1000枚舉x,就可以在固定x的情況下,用二分查找搜索y的值 - 如何二分查找:
- 首先聲明左邊界
let yLeft = 1,右邊界let yRight = 1000 - 計算它們的中間值,
const yMiddle = (yLeft + yRight) >> 1,或者可以用const yMiddle = Math.floor((yLeft + yRight) / 2) - 如果中間值用函數(shù)計算的結(jié)果
customfunction.f(x, yMiddle)大于z,說明y的值在yLeft和yMiddle之間,因此可以讓yRight = yMiddle - 1,繼續(xù)在yLeft和yMiddle - 1之間查找y - 如果中間值用函數(shù)計算的結(jié)果
customfunction.f(x, yMiddle)小于z,說明y的值在yMiddle和yRight之間,因此可以讓yLeft = yMiddle + 1,繼續(xù)在yRight和yMiddle + 1之間查找y
- 首先聲明左邊界
/**
* @param {CustomFunction} customfunction
* @param {integer} z
* @return {integer[][]}
*/
var findSolution = function(customfunction, z) {
let result = [] // 存儲結(jié)果
// 枚舉所有x
for (let x = 1; x <= 1000; x++) {
let yLeft = 1 // 二分查找的左邊界
let yRight = 1000 // 二分查找的右邊界
// 在固定x的前提下,二分查找y的值
while (yLeft <= yRight) {
// 取左右邊界的中間值
const yMiddle = (yLeft + yRight) >> 1
// 用函數(shù)計算中間值的結(jié)果
const middleResult = customfunction.f(x, yMiddle)
// 如果結(jié)果等于z,這時找到的x和y是是解之一
if (middleResult === z) {
result.push([x, yMiddle])
}
// 如果結(jié)果大于z,說明y的值在yLeft和yMiddle之間,因此將右邊界移動到y(tǒng)Middle - 1
if (middleResult > z) {
yRight = yMiddle - 1
} else {
// 如果結(jié)果小于z,說明y的值在yMiddle喝yRight之間,因此將左邊界移動到y(tǒng)Middle - 1
yLeft = yMiddle + 1
}
}
}
return result
};
復(fù)雜度分析:
- 時間復(fù)雜度:
- 空間復(fù)雜度:
。返回值不計入空間復(fù)雜度