1. 两数之和
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;
}
}