剑指Offer57.和为s的两个数字

1.哈希表:时间O(n):遍历一次,最坏情况下目标数在数组末尾,就需要把n-1个数都insert进哈希表,insert操作是O(1),空间O(n):最坏需要存n-1个数

class Solution {
    
    
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    
    
        unordered_set<int> us;
        for (auto x : nums) {
    
    
            if (us.find(target - x) != us.end()) return {
    
    x, target - x};
            else us.insert(x);
        }

        return {
    
    };
    }
};

2.使用双指针优化方法1:O(n),O(1)
数组本身有序,这是可以使用双指针的原因;

class Solution {
    
    
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    
    
        int n = nums.size();
        if (n == 1) return {
    
    };

        int l = 0, r = n - 1;
        while (l < r) {
    
    
            if (nums[l] + nums[r] > target) --r;
            else if (nums[l] + nums[r] < target) ++l;
            else return {
    
    nums[l], nums[r]};
        }

        return {
    
    };
    }
};
  • 总结:
    对于O(n ^ 2)的,通常可以使用哈希表或双指针(双指针需要有序)将其优化为O(n);
    同样本题,可以使用双指针将方法1的空间复杂度从O(n)优化为O(1);

猜你喜欢

转载自blog.csdn.net/jiuri1005/article/details/114404808