LeetCode 1. Two Sum

问题链接

LeetCode 1. Two Sum

题目解析

给定一数字数组及目标和,求数组中和为目标的两个数下标。

解题思路

暴力搜索肯定过不了,时间复杂度为 \(O(n^2)\),TLE教你做人。

本题利用map可以轻松过,怎么用呢?简单理解为map可以在两个对象之间建立联系,即(key, value)。

数组中的数字作为map的key,对应数组索引值作为value。由于问题求解为 \(x + y = target\),变个法子,\(x = target - y\)。遍历一遍数组,判断(target - nums[i])是否出现过,由于题目说明只有一种解法,所以一旦判断通过,即可返回答案。时间复杂度为 \(O(n)\)

小tip:注意这里一遍遍历时建立map数据,没有必要把所有数据加入map,也可以省去不少时间。

unordered_mapmap 并无太大区别,C++11中的新容器,一个无序一个有序罢了,在不同情况下各有优势。这里只需要判断存在,所以选择无序的unordered_map即可。

unordered_map::count - C++ Reference

unordered_map::find - C++ Reference

参考代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> m;
        for (int i = 0; i < nums.size(); ++i) {
            if (m.count(target - nums[i])) {
                return {m[target - nums[i]], i};
            }
            m[nums[i]] = i;
        }
        return {};
    }
};

相似题目

LeetCode 15. 3Sum
LeetCode 16. 3Sum Closest
LeetCode 18. 4Sum


LeetCode All in One题解汇总(持续更新中...)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


posted @ 2018-03-09 16:51  AlvinZH  阅读(702)  评论(0编辑  收藏  举报