LeetCode题解——1. 两数之和

题目相关

题目链接

LeetCode中国,https://leetcode-cn.com/problems/two-sum/

题目描述

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

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

示例

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

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

题目分析

LeetCode 给出本题难度简单。

题意分析

在给定的数组中,找出一组数据,和正好为 target。题目会保证只有一对答案。

样例数据分析

基础思路就是遍历一下数组,建立一个哈希表。我们的样例输入简单修改一下(如果不改,数据马上就出来了),改为 [2, 11, 15, 7],首先,我们建立一个哈希表 unordered_map<int, int> ans,第一个 int 存的是数组 nums 中的数据,第二个 int 存的是这个数据在数组 nums 的索引。

1、第一个数据为 2,目标为 9。因此 9-2=7,我们在 ans 中去查找有没有数据 7 的索引。如果有,说明已经找到;如果没有,也就我们可以建立 ans[2]=0。这个是什么意思呢?就是数据 2 的位置是在数组的第 0 个位置。

2、第二个数据为 11,目标为 9。因此 9-11=-2,我们在 ans 中去查找有没有数据 -2 的索引。如果有,说明已经找到;如果没有,也就我们可以建立 ans[11]=1。这个是什么意思呢?就是数据 11 的位置是在数组的第 1 个位置。

3、第三个数据为 15,目标为 9。因此 9-15=-6,我们在 ans 中去查找有没有数据 -6 的索引。如果有,说明已经找到;如果没有,也就我们可以建立 ans[15]=3。这个是什么意思呢?就是数据 15 的位置是在数组的第 2 个位置。

4、第三个数据为 7,目标为 9。因此 9-7=2,我们在 ans 中去查找有没有数据 2 的索引。这样我们可以在 ans 中找到数据 2,所以输出对应的数据就可以了。

算法设计

从上面的样例数据分析过程,我们可以看出了,核心问题就是要建立起索引表。方法很简单,就是遍历 nums 数组即可。

AC 参考代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> ans;//答案
        //遍历建立哈希表
        for (int i=0; i<nums.size(); i++) {
            if (ans.find(target-nums[i]) != ans.end()) {
                //只会对应一个答案
                return {ans[target-nums[i]], i};
            }

            ans[nums[i]] = i;
        }

        //没有结果
        return {};
    }
};

暴力法

本题也可以使用暴力搜索。思路就不详细写了,就是两个循环比对即可。

参考代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int len=nums.size();

        for(int i=0;i<len-1;i++) {
            for(int j=i+1;j<len;j++) {
                if (nums[i]+nums[j] == target) {
                    return {i,j};
                }
            }
        }
        
        return {};
    }
};

经过测试,这个暴力竟然能通过。可能是 LeetCode 对本题定义为简单导致的。

发布了268 篇原创文章 · 获赞 309 · 访问量 108万+

猜你喜欢

转载自blog.csdn.net/justidle/article/details/105248121