题目
题解
双指针
这道题有点偏数学方面,我的思路是偏向双指针,而且是普通的双指针,左指针指向最小数,也就0, 而右指针的指向数字就需要动动脑子。需要一个合适的数字作为右指针的指向,最开始我轻题啦,当数据量变多时就需要照顾到算法如何快速分辨出。也就是这道题是在考我们如何让算法快速分别出,而我最终选择右指针指向数字c的平方根向下取整。这样就会保持搜索范围很小
最开始的版本
/**
* @param {number} c
* @return {boolean}
*/
var judgeSquareSum = function(c) {
let l = 1;
let r = Math.floor(Math.sqrt(c))
let sum = '';
while(r > -1 && sum != c) {
sum = l * l + r * r
if(sum > c) {
r--;
continue;
}
if(sum < c) {
l++;
continue;
}
}
return sum == c
};
但是呢这个算法运行时间还是很慢
/**
* @param {number} c
* @return {boolean}
*
*/
var judgeSquareSum = function(c) {
let l = 0;
let r = Math.floor(Math.sqrt(c))
let sum = '';
while(l <= r) {
sum = l * l + r * r;
if(sum == c)return true;
if(sum > c) {
r--;
continue;
};
if(sum < c) {
l++;
continue;
}
}
return false
};
而这段算法中你觉得那里可以优化,最开始我觉的已经没有可以优化的啦,但是你看if判断是不是可以优化
/**
* @param {number} c
* @return {boolean}
*
*/
var judgeSquareSum = function(c) {
if(c < 0) return false;
let l = 0;
let r = Math.floor(Math.sqrt(c))
let sum = '';
while(l <= r) {
sum = l * l + r * r;
if(sum == c)return true;
else if (sum > c) r--;
else l++;
}
return false
};