双指针解决leetcode1两数之和

简介: 双指针解决leetcode1两数之和
为什么写这个内容

之前刷leetcode第一题的时候是用的hash表法做的,后来做三数之和与四数之和的时候强化了一下自己对于双指针的理解,于是想用双指针来重新做leetcode这一道题。

写在csdn也方便日后查看

一开始的思路

vector<int> twoSum(vector<int>& nums, int target) {
  sort(nums.begin(),nums.end());          
    int left = 0;                 //指向数组头
    int right = nums.size() - 1;          //指向数组尾
    while(left<right){                //当两个指针对撞结束循环
        if(nums[left] + nums[right] > target){    //大于目标值就左移右指针
            right--;
        }else if(nums[left] + nums[right] < target){//小于目标值就右移左指针
            left--;
        }else{
            return vector<int>{left,right};   //等于目标值时,返回左右指针  其实写这个的时候已经感觉有点不对劲了
        }
    }
    return {};
}

测试

测试一下:nums = [2,7,11,15] target = 9

输出正确

然后自信的提交代码。。。

解答错误,查看错误,

发现如果nums本来无序的话,则我这个方法不行

分析原因:

看了下题目,对比了三数之和、四数之和与两数之和的区别,发现他俩因为是返回的值,所以使用sort标准库函数排序是不影响输出结果的,而这道题两数之和,是返回其值的索引值,故对nums排序是大错特错的,估计我是做三数之和与四数之和做魔怔了

改正:

由于两数之和是返回索引值,故不能动数组本身的相对位置,于是我想到了map容器,让key保存值,value保存索引值,这样一来,当将nums中的数据插入map时,又可以自动给nums的数据排序,又可以记录nums里面数据的索引值,由于nums中的数据可以重复,故我使用multimap(唯一可以重复key的map类型容器)。

代码:

vector<int> twoSum(vector<int>& nums, int target) {
    multimap<int,int> temp;                 //用来存放nums的值和索引值
    int index = 0;                      //记录索引值     
    for(auto val : nums){
        temp.insert(pair<int,int>(val,index++));      //插入到multimap中自动排序的操作     
    }
    multimap<int,int>::iterator left = temp.begin();    //将双指针定义为迭代器
    multimap<int,int>::iterator right = --temp.end();   
    while(left != right){                 //不可以写成left<right 该迭代器没有定义此操作
        if(left->first + right->first > target){      //后面的思路就与上面的思路一样
            right--;
        }else if(left->first + right->first < target){
            left++;
        }else{
            return vector<int>{left->second,right->second}; //返回索引值
        }
    }
    return vector<int>{};
}

收获:

虽然执行时间与内存消耗一点都不两眼,但是我收获了对双指针操作的熟悉,之前觉得双指针有点抽象,但经过了三数之和、四数之和、还有自己重新用双指针解决两数之和后脑子里面对双指针的思路变得清晰了起来,并且对map的操作更熟悉了

相关文章
|
1月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
3月前
|
存储
LeetCode热题 首题 两数之和
LeetCode热题 首题 两数之和
19 1
|
4月前
|
存储 算法 Java
小白刷力扣之两数之和
小白刷力扣之两数之和
|
6月前
|
C语言
【Leetcode-1.两数之和 -3.无重复字符的最长子串 -9.回文数(C语言)】
【Leetcode-1.两数之和 -3.无重复字符的最长子串 -9.回文数(C语言)】
18 0
|
4月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
7月前
|
缓存 算法 Java
【手绘算法】力扣 1 两数之和(Two Sum)
Hi,大家好,我是Tom。一个美术生转到Java开发的程序员。从今天开始,我将带大家每天刷一道题。我会用手绘的方式给大家讲解解题思路。在解题过程中,也会手写一些伪代码。当然,如果想要完整的源码的话,可以到我的个人主页简介中获取。 今天给大家分享的是力扣启蒙题第1题,求两数之和。虽然很简单,但是它的通过率只有52%。
64 0
|
1月前
|
机器学习/深度学习 算法 索引
leetcode热题100.两数之和
leetcode热题100.两数之和
13 1
|
1月前
|
C语言
【C语言】Leetcode 两数之和 (含详细题解)
【C语言】Leetcode 两数之和 (含详细题解)
83 0
|
2月前
|
存储 算法 Go
LeetCode 第一题: 两数之和
  给定一个整数数组 `nums`​ 和一个目标值 `target`​,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组索引。\ 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
LeetCode 第一题: 两数之和
|
2月前
|
存储 索引 Python
LeetCode刷题笔记(1)—— 两数之和
LeetCode刷题笔记(1)—— 两数之和