2022-4-16 Leetcode 633.平方数之和

在这里插入图片描述
第一版,使用双指针,但是造成了溢出。
在这里插入图片描述

class Solution {
    
    
public:
    bool judgeSquareSum(int c) {
    
    
        vector<int> arr(c+1);
        for(int i = 0;i < c+1;i++){
    
    
            arr[i] = i;
        }
        int l = 0;
        int r = c;
        while(l <= r){
    
    
            unsigned long long int num = arr[l] * arr[l] + arr[r] * arr[r];
            if(num == c){
    
    
                return true;
            }else if(num > c){
    
    
                r--;
            }else {
    
    
                l++;
            }
        }
        return false;
    }
};

主要是需要使用sqrt 来防止溢出和降低时间复杂度。

第二版,依然会溢出。
Line 11: Char 43: runtime error: signed integer overflow: 829921 + 2146654224 cannot be represented in type ‘int’ (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:20:43

class Solution {
    
    
public:
    bool judgeSquareSum(int c) {
    
    
        int a = sqrt(c);
        vector<int> arr(a+1);
        for(int i = 0;i < arr.size();i++){
    
    
            arr[i] = i;
        }
        int l = 0,r = a;
        while(l <= r){
    
    
            long long num = arr[l]*arr[l] + arr[r]*arr[r];
            if(num == c){
    
    
                return true;
            }else if(num > c){
    
    
                r--;
            }else{
    
    
                l++;
            }
        }
        return false;
    }
};

第三版,将数组换成了long

class Solution {
    
    
public:
    bool judgeSquareSum(int c) {
    
    
        long a = sqrt(c);
        vector<long> arr(a+1);
        for(int i = 0;i < arr.size();i++){
    
    
            arr[i] = i;
        }
        int l = 0,r = a;
        while(l <= r){
    
    
            long long num = arr[l]*arr[l] + arr[r]*arr[r];
            if(num == c){
    
    
                return true;
            }else if(num > c){
    
    
                r--;
            }else{
    
    
                l++;
            }
        }
        return false;
    }
};

看了下官方答案,发现没有必要使用数组

class Solution {
    
    
public:
    bool judgeSquareSum(int c) {
    
    
        long left = 0;
        long right = (int)sqrt(c);
        while (left <= right) {
    
    
            long sum = left * left + right * right;
            if (sum == c) {
    
    
                return true;
            } else if (sum > c) {
    
    
                right--;
            } else {
    
    
                left++;
            }
        }
        return false;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sum-of-square-numbers/solution/ping-fang-shu-zhi-he-by-leetcode-solutio-8ydl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/weixin_51187533/article/details/124209406
今日推荐