题目
题解
双指针
这道题有点偏数学方面,我的思路是偏向双指针,而且是普通的双指针,左指针指向最小数,也就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 * rif(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};

