一、题目
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a + b = c 。
二、思路
1)暴力+优化:
解题优先考虑能够做出来,首先想到的就是暴力搜索的方法,由于c已经知道,只需要暴力搜索a和b即可,搜索范围为。
对暴力搜索的优化:
很容易想到双重循环找a和b,这样会造成很多的时间浪费,由于,可以只用一次遍历b,不断对a用sqrt函数求解,并判断a是否有小数即可(通过强转类型再判断是否相等即可)
2)双指针
如果我们的双指针begin和end指向区间的头和尾,有三种情况需要考虑:
1)如果
,直接返回
true2)如果,则
begin = begin + 13)如果,则end = end - 1
三、代码
1)暴力优化
class Solution {public boolean judgeSquareSum(int c) {int n = (int)Math.sqrt(c);for (int a = n; a >= 0; a--) {double b = Math.sqrt(c - a*a);if (b == (int)b) {return true;}}return false;}}
时间复杂度为,空间复杂度为O(1),但由于sqrt耗费时间较多,表现并不好。
2)双指针
class Solution {public boolean judgeSquareSum(int c) {int begin = 0, end = (int)Math.sqrt(c);while (begin <= end) {int val = begin * begin + end * end;if (val == c) {return true;}if (val < c) {begin++;} else {end--;}}return false;}}
时间复杂度为,空间复杂度为O(1),每个循环只有两次乘法运算,整体性能较好。
