题目
给出一个函数  f(x, y) 和一个目标结果 z,请你计算方程 f(x,y) == z 所有可能的正整数 数对 x 和 y。
给定函数是严格单调的,也就是说:
f(x, y) < f(x + 1, y)f(x, y) < f(x, y + 1)
函数接口定义如下:
1  | interface CustomFunction {  | 
如果你想自定义测试,你可以输入整数 function_id 和一个目标结果 z 作为输入,其中 function_id 表示一个隐藏函数列表中的一个函数编号,题目只会告诉你列表中的 2 个函数。
你可以将满足条件的 结果数对 按任意顺序返回。
示例 1:
1  | 输入:function_id = 1, z = 5  | 
示例 2:
1  | 输入:function_id = 2, z = 5  | 
提示:
1 <= function_id <= 91 <= z <= 100- 题目保证 
f(x, y) == z的解处于1 <= x, y <= 1000的范围内。 - 在 
1 <= x, y <= 1000的前提下,题目保证f(x, y)是一个 32 位有符号整数。 
题解
暴力法
思路
- 遍历 x 从 1 到 z 的所有组合
- 遍历 y 从 1 到 z 的所有组合
 - 如果两者作为变量使函数值等于目标值
 - 添加到答案中
 
 - 输出
 - 不推荐这个做法,完全没有利用到「递增」这个条件
 
代码
- 一行搞定
 
1  | class Solution:  | 
复杂度分析
- 时间复杂度
 - 空间复杂度,不算记录答案的空间是
 
二分查找法
思路
- 先遍历 x
- 对于每个 x ,可能存在一个对应的 y
 - 而 y 以及 f(x,y) 的值随着 y 的增加是增加的
 - 因此可以使用二分查找
 
 - 不推荐使用这个做法,因为只利用到了函数 f 对 y 变量是递增的,没有利用到对 x 也是这样。
 
代码
1  | class Solution:  | 
复杂度
- 时间复杂度
 - 空间复杂度,不算记录答案的空间是
 
双指针法
思路
- 由于函数 f 对于两个变量的偏导都是正的,那么可以使用双指针法。
 - 我们思考,先固定 x ,从1 开始,那么可以让 y 从后往前找到匹配值
 - 如果匹配到了以后,那么对应于这个 x 已经没用了,x 可以增加
 - 同时增加后的 x 要匹配的 y 就一定比上一个 y 少。
 - 这就是双指针法的思路。
 - 具体来讲就是
 - 一个 x 指向头(1),一个 y 指向尾(z)
 - 判断 x 和 y 能否使得函数值等于 z
- 当这个函数值小了,就增加 x
 - 当这个函数值大了,就减少 y
 - 相等的时候添加到答案,同时 x 和 y 一起增加。
 
 - 推荐使用这个方法,利用了函数 f 对两个变量的偏导都是正的这个条件。
 
代码
1  | class Solution:  | 
复杂度分析
- 时间复杂度
 - 空间复杂度,不算记录答案的空间是
 


