LeetCode题解:633. 平方数之和,双指针,JavaScript,详细注释

82 阅读1分钟

原题链接: leetcode.cn/problems/su…

解题思路:

  1. ab一定是00c\sqrt c之间的某个值。
  2. a的初始值设为0b的初始值设为c\sqrt cb必须为整数。
  3. ab向中间逼近,查找满足条件的值。
  4. 由于ab是可以交换的,两者相遇时,就查找了所有可能的值。
  5. a2+b2>ca^2+b^2>c时,b--
  6. a2+b2<ca^2+b^2<c时,a++
/**
 * @param {number} c
 * @return {boolean}
 */
var judgeSquareSum = function (c) {
  let a = 0 // a从最小值开始查找
  let b = Math.floor(Math.sqrt(c)) // b从最大值开始查找,需要保证初始值是整数

  // a和b可交换,因此只要搜索到两者相遇即可
  while (a <= b) {
    // 计算当前的a^2 + b^2值
    let curr = a ** 2 + b ** 2

    // 如果curr等于c,表示找到相应整数
    if (curr === c) {
      return true
    }
    // 如果curr大于c,减小b,向目标值逼近
    else if (curr > c) {
      b--
    }
    // 如果curr小于c,增大a,向目标值逼近
    else {
      a++
    }
  }

  // 如果退出循环,表示未找到a和b
  return false
}