高薪算法+计算机职称考试LeetCodeSwift in LeetCode

633. 平方数之和 Sum of Square Numbers

2019-08-19  本文已影响4人  1江春水

【题目描述】
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。

【示例1】

输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5

【示例2】

输入: 3
输出: False

【思路1】
1、暴力枚举 从0-c,是否存在两个数的平方和=c
2、时间复杂度O(n^2)
3、空间复杂度O(1)
4、超出时间限制

代码实现:

func judgeSquareSum(_ c: Int) -> Bool {
    if c == 0 { return true }
    for i in 0..<c {
        for j in i..<c {
            if i*i + j*j == c {
                return true
            }
        }
    }
    return false
}

【思路2】
1、使用集合Set
2、判断set是否包含c-ii,如果包含返回true 否则把ii加到set里,直到遍历结束
3、时间复杂度O(n)
4、空间复杂度O(n)

代码实现:

func judgeSquareSum(_ c: Int) -> Bool {
    if c == 0 { return true }
    var set = Set<Int>()
    for i in 0...Int(sqrt(Double(c))) {
        set.insert(i*i)
        if set.contains(c-i*i) {
            return true
        }
    }
    return false
}

【思路3】
1、双指针
2、定义两个变量left=0 right=sqrt(c)
3、两个变量的平方和小于c,那么左指针+1
4、两个变量的平方和大于c,那么右指针-1,直到遍历结束
5、 时间复杂度O(n)
6、空间复杂度O(1)

代码实现:

func judgeSquareSum(_ c: Int) -> Bool {
    if c == 0 { return true }
    var j = Int.init(sqrt(Double(c)))
    var i = 0
    while i < j {
        if i*i + j*j < c {
            i+=1
        }
        if i*i + j*j > c {
            j-=1
        }
        if i*i + j*j == c {
            return true
        }
    }
    return false
}

后续会继续更新文章,也可以关注我的公众号,基本每日一题🙂:


个人公号.jpg
上一篇下一篇

猜你喜欢

热点阅读