原题链接:
https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/
解题思路:
- 根据题意,在给定
x
的情况下,y
是单调递增的 - 因此,我们可以从
1
到1000
枚举x
,就可以在固定x
的情况下,用二分查找搜索y
的值 - 如何二分查找:
- 首先声明左边界
let yLeft = 1
,右边界let yRight = 1000
- 计算它们的中间值,
const yMiddle = (yLeft + yRight) >> 1
,或者可以用const yMiddle = Math.floor((yLeft + yRight) / 2)
- 如果中间值用函数计算的结果
customfunction.f(x, yMiddle)
大于z
,说明y
的值在yLeft
和yMiddle
之间,因此可以让yRight = yMiddle - 1
,继续在yLeft
和yMiddle - 1
之间查找y
- 如果中间值用函数计算的结果
customfunction.f(x, yMiddle)
小于z
,说明y
的值在yMiddle
和yRight
之间,因此可以让yLeft = yMiddle + 1
,继续在yRight
和yMiddle + 1
之间查找y
- 首先声明左边界
/**
* @param {CustomFunction} customfunction
* @param {integer} z
* @return {integer[][]}
*/
var findSolution = function(customfunction, z) {
let result = [] // 存储结果
// 枚举所有x
for (let x = 1; x <= 1000; x++) {
let yLeft = 1 // 二分查找的左边界
let yRight = 1000 // 二分查找的右边界
// 在固定x的前提下,二分查找y的值
while (yLeft <= yRight) {
// 取左右边界的中间值
const yMiddle = (yLeft + yRight) >> 1
// 用函数计算中间值的结果
const middleResult = customfunction.f(x, yMiddle)
// 如果结果等于z,这时找到的x和y是是解之一
if (middleResult === z) {
result.push([x, yMiddle])
}
// 如果结果大于z,说明y的值在yLeft和yMiddle之间,因此将右边界移动到yMiddle - 1
if (middleResult > z) {
yRight = yMiddle - 1
} else {
// 如果结果小于z,说明y的值在yMiddle喝yRight之间,因此将左边界移动到yMiddle - 1
yLeft = yMiddle + 1
}
}
}
return result
};
复杂度分析:
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( 1 ) O(1) O(1)。返回值不计入空间复杂度