征战leetcode前200的DAY1:两数之和(Easy)

142 阅读1分钟

题目: 给定一个数组和一个目标值,找出和为目标值的两个元素,并且返回索引。

  1. 第一反应是可以暴力,就是复杂度为O(N^2),似乎不太好,时间复杂度太高。 就是简单的遍历数组两次得到答案。
class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            for (int i = 0 ;i < nums.size(); i++) {
                for (int j = i + 1; j < nums.size(); j++) {
                    if (nums[i] + nums [j] == target) {
                        return {i,j};
                    }
                }
            }
            return {};
        }
};

第二种,则是用空间换时间,用一个哈希表去记录(对应的元素内容为key,索引为value),通过用哈希表去搜寻是否有target - map[num[i]]的元素,并返回索引,没有则把元素内容作为key,索引作为value进行存储。

class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
           //用一个数组存储返回的结果
            vector<int>resultArr(2,-1);
            map<int, int>a;
            for (int i = 0; i < nums.size(); i++) {
                if (a.count(target - nums[i]) > 0) {
                    resultArr[0] = a[target - nums[i]];
                    resultArr[1] = i;
                }
                a[nums[i]] = i;
            }
            return resultArr;
        }
};