題目**
給定乙個非負整數c
,你要判斷是否存在兩個整數a
和b
,使得 a2 + b2 = c。
示例1:
輸入:5
輸出: true
解釋:1 * 1 + 2 * 2 = 5
示例2:
輸入: 3
輸出: false
方法一:二分查詢
從0到sqrt(c),每次確定乙個數i,在從i~sqrt(c)中查詢是否有j*j=c-i*i
注意:數字可以是0,兩個數字也可以相同
public boolean judgesquaresum(int c)
}return false;
}public boolean binarysearch(long low,long high,int target)
long mid=(low+high)/2;
long s=mid*mid;
if(s==target) else if(s時間複雜度o(c1/2log2c1/2)方法二:sqrt()
public boolean judgesquaresum(int c)
}return false;
}
時間複雜度o(c1/2)方法三:雙指標
可以看成是在元素為 0~target 的有序陣列中查詢兩個數,使得這兩個數的平方和為 target,和上一題類似,只有乙個明顯區別:乙個是和為 target,乙個是平方和為 target。本題同樣可以使用雙指標得到兩個數,使其平方和為 target。
本題的關鍵是右指標的初始化,實現剪枝,從而降低時間複雜度。設右指標為 x,可以將 x 取為 sqrt(target)。
public boolean judgesquaresum(int c) else if (sum < c) else
}return false;
}
時間複雜度o(c1/2) 633 平方數之和
給定乙個非負整數 c 你要判斷是否存在兩個整數 a 和 b,使得 a2 b2 c。示例1 示例2 可以看成是在元素為 0 target 的有序陣列中查詢兩個數,使得這兩個數的平方和為 target,如果能找到,則返回 true,表示 target 是兩個整數的平方和。本題和 167.two sum ...
平方數之和 雙指標)
題目描述 給定乙個非負整數 c 你要判斷是否存在兩個整數 a 和 b,使得 a2 b2 c。輸入測試資料由多組測試樣例組成。每組測試樣例第一行輸入乙個正整數 c 1 c 2147483647 資料約束 對於c 100000,每個測試檔案不超過1000組。對於100000 c 2147483647 每...
633 平方數之和
給定乙個非負整數 c 你要判斷是否存在兩個整數 a 和 b,使得 a2 b2 c 示例 1 輸入 c 5 輸出 true 解釋 1 1 2 2 5 示例 2 輸入 c 3 輸出 false 示例 3 輸入 c 4 輸出 true 示例 4 輸入 c 2 輸出 true 示例 5 輸入 c 1 輸出 ...