C#LeetCode刷題之#633-平方數之和( Sum of Square Numbers)
阿新 • • 發佈:2018-12-14
問題
給定一個非負整數 c ,你要判斷是否存在兩個整數 a 和 b,使得 a2 + b2 = c。
輸入: 5
輸出: True
解釋: 1 * 1 + 2 * 2 = 5
輸入: 3
輸出: False
Given a non-negative integer c, your task is to decide whether there're two integers a and b such that a2 + b2 = c.
Input: 5
Output: True
Explanation: 1 * 1 + 2 * 2 = 5
Input: 3
Output:
False
示例
public class Program { public static void Main(string[] args) { var num = 3; var res = CheckSumOfSquareNumbers(num); Console.WriteLine(res); num = 5; res = CheckSumOfSquareNumbers2(num); Console.WriteLine(res); Console.ReadKey(); } private static bool CheckSumOfSquareNumbers(int c) { //算是暴力解法 //不過沒必要全部計算,否則肯定TLE var sqrt = (int)Math.Sqrt(c); for(var i = 0; i <= sqrt; i++) { //計算值 c - i * i double k = Math.Sqrt(c - i * i); //判定是否相待,這是常用的判定開根號與目標值是否相等的寫法 if((int)k == k) return true; } return false; } private static bool CheckSumOfSquareNumbers2(int c) { //雙指標法 var sqrt = (int)Math.Sqrt(c); //存放計算 平方的和 的值 var sum = 0; //前後指標 var i = 0; var j = sqrt; //指標碰撞時為止 while(i <= sqrt) { sum = i * i + j * j; if(sum < c) { i++; } else if(sum > c) { j--; } else { return true; } } return false; } }
以上給出2種演算法實現,以下是這個案例的輸出結果:
False
True
分析:
顯而易見,以上2種演算法的時間複雜度均為: 。