LeetCode 1.Two Sum 解题报告

LeetCode 1. Two Sum 解题报告

题目描述

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.


示例

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].


限制条件

没有明确给出。


解题思路

我的思路:

最简单的方式当然就是暴力破解,直接用两个for循环就可以搞定。
这种方式太粗暴了一些,所以还是想其它更为优雅的方式。记得之前做了这道题的一个变种题LeetCode 167.Two Sum II。167题中给出的数组是有序的,直接用双指针的方法就能找到对应的两个数的下标。可以把该题的思路用到这里,分成三步进行:
1.拷贝一份数组,并对数组副本进行排序
2.在数组副本中利用双指针的方法得到和等于目标的两个数
3.在原来的数组中寻找这两个数的索引并返回

参考思路:

题目中的数值及索引构成了一个对应关系(value, index),所以可以考虑用multimap结构存储这些对应关系。
遍历数组,对于每一个元素 num[i] ,都可以先求出 targetnum[i] ,判断 targetnum[i]index 是否在multimap中,如果存在,则表明找到了和为 target 的两个数,并且它们的坐标分别是 targetnum[i]index 中的 index i 。如果不存在,则把num[i]i插入到multimap中,继续下一个元素。
由于和是有两个数相加,所以第一个数肯定会被插入到multimap中,当遍历到第二个数时就会满足判断条件从而得到结果。


代码

我的代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> indexes;
        vector<int> numsCopy(nums);
        int left = 0;
        int right = numsCopy.size() - 1;

        sort(numsCopy.begin(), numsCopy.end());
        while(left < right) {
            int sum = numsCopy[left] + numsCopy[right];
            if (sum == target) {
                break;
            } else if (sum > target) {
                right--;
            } else {
                left++;
            }
        }

        for (int i = 0; i < nums.size(); i++) {
            if(nums[i] == numsCopy[left]) {
                indexes.push_back(i);
                continue;
            }
            if(nums[i] == numsCopy[right]) {
                indexes.push_back(i);
                continue;
            }
        }

        return indexes;
    }

};
参考代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> indexes;
        multimap<int, int> mMap;
        for (int i = 0; i < nums.size(); i++) {
            int component = target - nums[i];
            multimap<int, int>::iterator itr = mMap.find(component);
            if (itr != mMap.end()) {
                indexes.push_back(itr->second);
                indexes.push_back(i);
                break;
            }
            mMap.insert(pair<int, int>(nums[i], i));
        }
        return indexes;
    }

};

总结

这道题给出的tag是hash table,所以我通过之后就去找了哈希表的资料看看,感觉还没有怎么深刻去理解哈希表,所以还是靠做哈希表相关的题加深一下理解吧。
闲着没事就多填坑,少打游戏,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值