Sum问题:leetcode 1 两数之和&leetcode15 三数之和

leetcode 1 两数之和:用哈希

题目来源:leetcode 1 两数之和

题目描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

解题思路:

用哈希表保存数组的位置,判断另一个数是否在哈希表中(且不能是当前数)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> m;
        vector<int> ans;
        for(int i=0;i<nums.size();i++)
            m[nums[i]]=i;
        for(int i=0;i<nums.size();i++){
            auto it=m.find(target-nums[i]);
            if(it!=m.end()&&it->second!=i)
            {
                ans.push_back(i);
                ans.push_back(m[target-nums[i]]);
                return ans;
            }
        }
        return ans;
    }
};

leetcode15 三数之和:用排序+双指针

题目来源: leetcode15 三数之和

题目描述:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解题思路:

先要对数组进行排序,这是后面双指针和去重的基本条件。然后固定第一个数,用双指针找后面两个数。注意相同数字要跳过,以免结果中有重复。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++){
            //双指针找结果
            int l=i+1,r=nums.size()-1,target=0-nums[i];
            while(l<r){
                if(nums[l]+nums[r]>target) r--;
                else if(nums[l]+nums[r]<target) l++;
                else {
                    vector<int> temp(3,0);
                    temp[0]=nums[i];
                    temp[1]=nums[l];
                    temp[2]=nums[r];
                    ans.push_back(temp); 
                    while(l<r&&nums[l]==temp[1]) l++;//去重
                    while(l<r&&nums[r]==temp[2]) r--;//去重
                } 
            }
            while(i+1<nums.size()&&nums[i+1]==nums[i]) i++;//去重
        }
        return ans;
    }
};
posted @ 2020-07-01 11:24  拉里拉里啦啦  阅读(108)  评论(0编辑  收藏  举报