LeetCode題解:1237. 找出給定方程的正整數(shù)解,二分查找,詳細注釋

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

解題思路:

  1. 根據(jù)題意,在給定x的情況下,y是單調(diào)遞增的
  2. 因此,我們可以從11000枚舉x,就可以在固定x的情況下,用二分查找搜索y的值
  3. 如何二分查找:
    • 首先聲明左邊界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的值在yLeftyMiddle之間,因此可以讓yRight = yMiddle - 1,繼續(xù)在yLeftyMiddle - 1之間查找y
    • 如果中間值用函數(shù)計算的結(jié)果customfunction.f(x, yMiddle)小于z,說明y的值在yMiddleyRight之間,因此可以讓yLeft = yMiddle + 1,繼續(xù)在yRightyMiddle + 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ù)雜度:O(nlogn)
  • 空間復(fù)雜度:O(1)。返回值不計入空間復(fù)雜度
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容