[C++][Leetcode]Two Sum以及其变形

本文介绍了LeetCode中与两数之和相关的题目,包括1两数之和、15三数之和、16最接近的三数之和、18四数之和和454四数之和II。针对每个问题,文章详细阐述了思路分析,主要涉及使用哈希映射、排序和双指针等方法来解决这些问题。
摘要由CSDN通过智能技术生成

目录

 

1.Leetcode 1 两数之和

2.Leetcode 15 三数之和

3.Leetcode 16 最接近的三数之和

4.Leetcode 18 四数之和

5. Leetcode 454 四数之和II


1.Leetcode 1 两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  • 思路分析
    • 使用map做hashmap,使用额外的空间(n),一趟遍历进行判断。如果不在map,就加入,在map就计数。
    • 因为需要返回下标,所以用sort+双指针不方便。
  • 代码设计
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        vector<int>res;
        int n=nums.size();
        
        map<int,int>hashmap;
        
        for(int i=0;i<n;++i)
        {
            if(hashmap.find(target-nums[i])!=hashmap.end()&&hashmap[target-nums[i]]!=i)//存在
            {
                res.push_back(i);
                res.push_back(hashmap[target-nums[i]]);
                break;
            }
            else
                hashmap[nums[i]]=i;
        }
        return res;
        
    }
};

 

2.Leetcode 15 三数之和

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

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



示例:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



  • 思路分析
    •  第一种思路,时间复杂度为N*2,空间复杂度为N。对于三个数,我们分成两部分,固定一个数,然后使用Two Sum的思路,去判断这个数的负数是不是有Two sum的解。Two Sum的求解办法是使用一个map,进行O(n)的遍历,边遍历边放进map中。但是需要考虑到数组中有重复元素,所以结果集合里面也有重复,所以需要判断一下,如果结果集合中已经有这个解了,就不再加入。
    • 第二种思路,时间复杂度为NlogN。我们采用快速排序的库函数,得到排序后的数组。我们也是像第一种思路一样,固定一个数,然后去寻找两个数之后是该数的负数。因为现在是排序数组,所以我们可以采用双指针遍历查找,为了避免重复组合,我们需要将两个指针设置到一个范围,比如都在目标数的右侧且相互不相遇。如果不加约束,那么会出现重复的组合:比如a[i]+a[j]=target;a[j]+a[i]=target。除此之外,我们还有两个策略去避
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值