自学内容网 自学内容网

简单题:1.两数之和

题目描述:

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

要求:

可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

解答:

方法一、暴力枚举:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        int result_i=0,result_j=0;
        for(int i=0;i<nums.size();++i){
            for(int j=0;j<nums.size();++j){
                if(nums[i]+nums[j] == target && j!=i){
                    result_i = i;
                    result_j = j;
                    break;
                }
            }
        }
        std::vector<int> result;
        result.push_back(result_i);
        result.push_back(result_j);
        return result;
    }
};

方法二、哈希表:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,int> hashtable;
        for(int i=0;i<nums.size();++i){
            auto it=hashtable.find(target-nums[i]);
            if(it !=hashtable.end()){
                return{it->second,i};
            }
            hashtable[nums[i]]=i;
        }
        return {};
    }
};

哈希表的特性:

(1)查找时复杂度为O(1);
(2)使用insert插入元素时,第一次insert成功,第二次insert不能将第一次的值覆盖;
(3)使用索引赋值时,能将元素进行有效更新。

例:

#include<unordered_map>

// 初始 map 的内容为{{1,1},{2,2},{3,3}}
unordered_map<int, int> map{{1,1},{2,2},{3,3}};
//修改第3个元素
map[3]=4;
// map的内容更新为{{1,1},{2,2},{3,4}}
// 插入新元素
map.insert({4,10});
// map的内容更新为{{1,1},{2,2},{3,4},{4,10}}
// 试图修改map第4个元素的值
map.insert({4,20});
// map的内容仍为{{1,1},{2,2},{3,4},{4,10}}

原文地址:https://blog.csdn.net/qq_43685921/article/details/144310696

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!