leetcode 剑指 Offer 57. 和为s的两个数字 & 1. 两数之和(2020.10.3)

【题目】剑指 Offer 57. 和为s的两个数字 & 1. 两数之和

注意,1.两数之和 这题要返回的是数的下标,且数组无序

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]

示例 2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6

【解题思路1】双指针

利用数组有序这个条件,从两端向中间扫描

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while(left < right) {
            int sum = nums[left] + nums[right];
            if(sum == target) {
                return new int[]{nums[left], nums[right]};
            } else if(sum < target) {
                left++;
            } else {
                right--;
            }
        }
        return new int[]{};
    }
}

时间复杂度:O(N)
空间复杂度:O(1)

【解题思路2】哈希表

如果数组无序,可以先排序再双指针,或者使用哈希表来判断是否存在对应的数
注意,1.两数之和 这题要返回的是数的下标,且数组无序,所以只能用哈希表来做

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        return new int[]{};
    }
}

时间复杂度:O(N)
空间复杂度:O(N)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int> m;
        for(int i = 0; i < nums.size(); i++) {
            if(m.count(target - nums[i]) > 0) {
                return {m[target - nums[i]], i};
            } else {
                m.insert(map<int, int> :: value_type(nums[i], i));
            }
        }
        return {};
    }
};
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页