1.题目:BM50 两数之和
描述:
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
2.算法:
1.暴力算法
2.哈希算法
3.算法思想
对于本题,具体解题思路为(如图所示):
-
定义哈希表hashmap,其存放的键值对为<取值,下标>。
-
从开始处遍历数组,对于第i个位置,在哈希表中寻找target-nums[i]是否存在,若存在,将两个下标放入数组中返回;若不存在,将其添加至表中,继续遍历。
4.代码:
/*************************************************
作者:She001
时间:2022/10/9
题目:BM50 两数之和
描述:
描述
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
示例1
输入:
[3,2,4],6
返回值:
[2,3]
说明:
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
示例2
输入:
[20,70,110,150],90
返回值:
[1,2]
说明
20+70=90
***************************************************/
#include<bits/stdc++.h>
using namespace std;
//算法:
//1.暴力算法
vector<int> fangfa_1(vector<int>&a,const int n)
{
vector<int>res;
for(int i=0;i<a.size();i++)
{
for(int j=i+1;j<a.size();j++)
{
if(a[i]+a[j]==n)
{
res.push_back(i+1);
res.push_back(j+1);
return res;
}
}
}
}
//2.哈希算法
//函数: 返回值: 动态数组
//参数: 1.动态数组
// 2.两数之和
// 函数功能: 寻找两数之和的目标 : 下标
vector<int> fangfa_2(vector<int>&a ,const int n)
{
vector<int>res;//建立一个容器作为返回值
//建立一个哈希表
//建议哈希表的目的是 把动态数组里面的数值 存储到 哈希表里面,快速的 查询
map<int, int> hash; //建立一个哈希表, 第一个 key 为 int 类型 第二个 参数为值 为 int 类型
for(int i=0;i<a.size();i++)// 放入元素, 并且查询
{
int temp=n-a[i];
if( hash.find(temp) == hash.end() )//end() 是最后的坐标, 假如等于这个东西那么 就是没有找到,
{
hash[a[i]]=i;
}
else//找到需要的东西
{
res.push_back(hash[temp]+1);//小的数的地址
res.push_back(i+1); //大的数的地址
break;
}
}
return res;
}
int main()
{
int n;
vector<int>a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
a.push_back(6);
a.push_back(7);
vector<int>a1=fangfa_1(a,6);
cout<<a1[0]<<" "<<a1[1]<<endl;
vector<int>a2=fangfa_2(a,6);
cout<<a2[0]<<" "<<a2[1]<<endl;
return 0;
}