1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。

初见此题,第一时间想到的是暴力
代码:

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 {};
    }
};

注意:j从i+1开始遍历,遍历到最后i=nums.size()-1时,j超出nums.size()为空,若j也从i开始遍历,可能出现i==j,例如:target = 4,nums = [1,2,3]
得到i = 1,j = 1;即nums[i] == nums[j],此时nums[i] + nums[j] == target

最后为什么要return{}?
此函数的返回值类型为vector,此函数必须有一个返回值,如果在循环中没找到符合条件的索引,则需要返回一个空的vector

分析:使用了嵌套循环,时间复杂度为O(n^2),
返回的vector为输出空间,只是用了i,j等几个额外变量,无额外数据结构,空间复杂度为O(1)

还能更快吗?
再看题目,找值,返回下标,把这两个结合在一起可以使用hash_map
代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++){
            auto t = map.find(target - nums[i]);
            if(t != map.end()){
                return {t->second,i};
            }
            map[nums[i]] = i;
        }
        return {};
    }
};

注意:对t定义时使用auto,自适应
map[nums[i]] = i,让值作为键,直接存入map中,后续只需判断map中是否存在target-nums[i],节省时间

分析:
时间复杂度:hash_map查找的平均时间复杂度为O(1),插入操作 map[nums[i]] = i;的平均时间复杂度为O(n),使用一个for循环,时间复杂度为O(n),
空间复杂度:额外使用了一个hash_map,空间复杂度为O(n)

posted @ 2026-03-03 22:24  Cloud00  阅读(0)  评论(0)    收藏  举报