LeetCode题解:1237. 找出给定方程的正整数解,二分查找,详细注释

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

解题思路:

  1. 根据题意,在给定x的情况下,y是单调递增的
  2. 因此,我们可以从11000枚举x,就可以在固定x的情况下,用二分查找搜索y的值
  3. 如何二分查找:
    • 首先声明左边界let yLeft = 1,右边界let yRight = 1000
    • 计算它们的中间值,const yMiddle = (yLeft + yRight) >> 1,或者可以用const yMiddle = Math.floor((yLeft + yRight) / 2)
    • 如果中间值用函数计算的结果customfunction.f(x, yMiddle)大于z,说明y的值在yLeftyMiddle之间,因此可以让yRight = yMiddle - 1,继续在yLeftyMiddle - 1之间查找y
    • 如果中间值用函数计算的结果customfunction.f(x, yMiddle)小于z,说明y的值在yMiddleyRight之间,因此可以让yLeft = yMiddle + 1,继续在yRightyMiddle + 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)。返回值不计入空间复杂度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值