LeetCode题解:1237. 找出给定方程的正整数解,双指针,详细注释

原题链接:
https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/

解题思路:

  1. 回顾题目给出的两个条件:
    • f(x, y) < f(x + 1, y)
    • f(x, y) > f(x, y - 1),由f(x, y) < f(x, y + 1)变化而来
  2. 如果我们先声明let x = 1, y = 1000,相对于z有以下几种情况:
    • f(x, y) < z时,只需要将x++
    • f(x, y) > z时,只需要将y--
    • f(x, y) === z时,当前xy是一个解
  3. x === 1000y === 1时,所有的解都已经查找出来
/**
 * @param {CustomFunction} customfunction
 * @param {integer} z
 * @return {integer[][]}
 */
var findSolution = function(customfunction, z) {
  let result = [] // 存储结果

  for (
    // x默认值为左边界,y默认值为右边界
    let x = 1, y = 1000;
    // x向右移动,y向左移动,x和y都到达边界时,表示已经查找到所有结果,退出循环
    x <= 1000 && y >= 1;
  ) {
    // 计算当前x、y对应的结果
    const subResult = customfunction.f(x, y)

    // f(x, y) < f(x + 1, y)
    if (subResult < z) {
      x++
    }
    // f(x, y) > f(x, y - 1)
    else if(subResult > z) {
      y--
    } else {
      // f(x, y) === z,存储[x, y],并移动x和y
      result.push([x++, y--])
    }
  }

  return result
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)。返回值不计入空间复杂度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值