leetcode热题:两数之和

leetcode热题100 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]

示例 3:

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

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

题目分析

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

做题讲究的是,输入什么数据,输出什么数据!!!就这么简单,在有时候工作写一部分功能的时候,也是这样。
在做出来一个题的前提是把题目看懂,题目的大体意思就是从一共数组中寻找2个整数,这两个整数的和 为 target ,两个数的位置没有要求,返回值是得到这两个数的下标

方法 1 枚举 时间复杂度为o(n2)

思路

由于数组中的一样的元素不能重复出现,也就是一共数不能使用两次。,枚举的思路就是,遍历所有的情况,然后得到解。
nums = [2,7,11,15]
2 7 = 9
2 11 =13
2 15 =17
7 11 =18
7 15 =22
11 15 =26
把所有情况枚举出来,
具体代码如下:


    //暴力枚举
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {       //从i+1开始,就是为了不和当前元素重复
                if (nums[i] + nums[j] == target) { // 两个数的和为target ,我们就返回下标数组
                    return { i, j };  //存在
                }
            }
        }
        return {};//不存在的时候也要返回空列表
    }

方法 2 哈希表

思路

使用哈希表一般都是用空间换取时间。
我们把已经遍历过的元素存储到哈希表中,然后我们在进行查询当前元素是都满足条件时,只需使用count函数即可查询,这样查询的时间复杂度为o(1),整体时间复杂度为o(n),仔细理解每次查询arr.count(target - nums[i]),因为每次都把当前元素放入哈希表中,我们只用查询剩余值是否在哈希表中出现过即可!!

具体代码实现如下

arr.count(target - nums[i])
    vector<int> twoSum(vector<int>& nums, int target) {
        int i;
        int n = nums.size();//记录数组的长度
        //unordered_map介绍在文章末尾,第一个int表示key,value是一个vector<int>   value存储的是满足条件的数组下标
        unordered_map<int,vector<int>> arr;  
        vector<int> a;
        for ( i = 0; i < n; i++)                //循环整个数组
        {
            arr[nums[i]].push_back(i);          //把当前元素加入哈希表中
            //特殊情况:如果当前元素的2倍,等于目标值,就是存在元素一样的时候,
            // 如果{3,3} ,然后把3加入之后,在哈希表中找到3,但是3已经使用过一次了,所以当value中的vector长度为2,说明存在两个下标,那就没有重复利用,直接返回即可
            if (target - nums[i] == nums[i])
            {
                if (arr[nums[i]].size() == 2)
                {
                    
                    return arr[nums[i]];
                }
            }
            //如果剩下的值 target-nums[i]在哈希表中找到了的话,就存储当前元素下标和哈希表中的value的第一个元素,并且退出大循环
            else if (arr.count(target - nums[i]))
            {
                a.push_back(i);
                a.push_back(arr[target - nums[i]][0]);
                break;
            }
        }
        return a;
    }

map与unordered_map介绍

map

map 是 C++ 标准库中的一个容器,用于实现有序的关联容器。它提供了一种键值对的存储方式,其中的键和值都可以是任意类型的数据。map 中的元素是按照键的顺序进行排序的,默认情况下是按照键的升序排列。map 的特点是支持快速的插入、查找和删除操作,其平均时间复杂度为 O(log n)。
简单来说,map的存储是有序的,根据key进行排序!!!

unordered_map

unordered_map是 C++ 标准库中的一个容器,用于实现哈希表(Hash Table)。它提供了一种键值对的存储方式,其中的键和值都可以是任意类型的数据。unordered_map 的特点是快速的插入、查找和删除操作,平均时间复杂度为 O(1)。unordered_map 中的元素是无序存储的,因此元素的顺序与它们被插入时的顺序不一定相同。
简单来说,unordered_map 的存储是无序的!!!

使用方法,由于两者使用方法相似所以只进行一种介绍,如果想要c++文档可以给我评论

如果想要文档进行学习,请评论我,后续我也会把文档上传

#include <iostream>
#include <map>
using namespace std;
int main() {
    map<string, int> myMap;
    // 插入元素
    myMap["apple"] = 10;
    myMap["banana"] = 20;
    myMap["orange"] = 15;
    // 访问元素
    cout << "Value of apple: " << myMap["apple"] << endl;
    // 查找元素
    if (myMap.find("banana") != myMap.end()) {
        cout << "Found banana with value: " << myMap["banana"] << endl;
    }
    // 删除元素
    myMap.erase("orange");
    // 遍历元素
    for (auto pair : myMap) {  //auto是c++11标准
        cout << pair.first << ": " << pair.second << endl;
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值