1. 程式人生 > >C#LeetCode刷題之#633-平方數之和( Sum of Square Numbers)

C#LeetCode刷題之#633-平方數之和( Sum of Square Numbers)

問題

給定一個非負整數 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種演算法的時間複雜度均為: O(n)