633. 平方數之和
- 1. 題目描述
- 2.詳細題解
- 3.代碼實現
- 3.1 Python
- 3.2 Java
- 內存溢出溢出代碼
- 正確代碼與截圖
1. 題目描述
題目中轉:633. 平方數之和
2.詳細題解
? ? 本題是167. 兩數之和 II - 輸入有序數組(中等)題目的變型,由兩數之和變為兩數平方之和,判斷是否存在滿足條件的兩個整數a和b,使之平方之和等于給定的整數c。
??對于給定整數c,a和b最小值為0,最大值為c的平方根,因此,兩個雙指針的初始值分別為0和c的平方根(取整數),算法如下:
- ??Step1:初始化:left=0,right=c的平方根取整;
- ??Step2:計算left和right指向數字平方之和;
- ??Step3:如果平方之和等于給定數字c,則中止返回True
- ??Step4:如果平方之和大于給定數字c,則右指針right減少1,讓平方之和小一點;
- ??Step5:如果平方之和小于給定數字c,則左指針left增加1,讓平方之和大一點;
- ??Step6:重復步驟Step2_Step5.
3.代碼實現
3.1 Python
import math
class Solution:def judgeSquareSum(self, c: int) -> bool:left, right = 0 , int(math.sqrt(c))res = Falsewhile left <= right:sum = left ** 2 + right ** 2if sum == c:res = Truebreakelif sum > c:right -= 1else:left += 1return res
3.2 Java
- Java實現需要尤其注意的是,對于數字有數據類型,仔細查看題意要求的數字范圍,因此需要使用long整數類型,否則程序會因為內存溢出導致錯誤結果,如下代碼和截圖所示:
內存溢出溢出代碼
class Solution {public boolean judgeSquareSum(int c) {int left = 0, right = (int) Math.sqrt(c);int total = 0;boolean res = false;while (left <= right){total = left * left + right * right;if (total == c){res = true;break;}else if(total > c){right--;}else{left++;}}return res;}
}
??調整整數數據類型,重新debug代碼:
正確代碼與截圖
class Solution {public boolean judgeSquareSum(int c) {long left = 0, right = (long) Math.sqrt(c);long total = 0;boolean res = false;while (left <= right){total = left * left + right * right;if (total == c){res = true;break;}else if(total > c){right--;}else{left++;}}return res;}
}
??執行用時不必過于糾結,對比可以發現,對于python和java完全相同的編寫,java的時間一般是優于python的;至于編寫的代碼的執行用時擊敗多少對手,執行用時和網絡環境、當前提交代碼人數等均有關系,可以嘗試完全相同的代碼多次執行用時也不是完全相同,只要確保自己代碼的算法時間復雜度滿足相應要求即可,也可以通過點擊分布圖查看其它coder的code。