1.题目:给定一个整数数组numbers,从数组中找出两个数满足相加之和等于目标数 target 。假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组形式返回.
2.算法:
1.暴力算法 时间复杂度O(n2) 空间复杂度O(1)
2.map 加循环的算法 时间复杂度O(n) 空间复杂度O(n)
3.算法思想:
1.暴力算法:
两层循环 暴力匹配 //因为要返回数组 ,所以要开辟空间 然后返回指针,main 函数接收指针 ,这个指针存在的空间是连续的。
2.map 加循环的算法:(这里看不懂,开代码 ,很容易)
2.1建立一个map。
2.2用要求得数 减去 数组这个时候的值, 得到要求的值。
2.3 然后使用 map 函数中的 count 看需要的值存不存在!
2.4存在使用迭代器,把他找出来。
2.5不存在,把这个值存入map.
代码:
/*************************************************
作者:she001
时间:2022/8/22
内容: 给定一个整数数组numbers,从数组中找出两个数满足相加之和等于目标数 target 。
假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。
返回两数的下标值,以数组形式返回
***************************************************/
#include<iostream>
#include<map>
using namespace std;
//暴力算法
//两层循环 暴力匹配 //因为要返回数组 ,所以要开辟空间 然后返回指针,main 函数接收指针 ,这个指针存在的空间是连续的。
int* fangfa_1(int num[],int n,int m)//num 是int 的数组 n是数组的长度 m 要匹配的数 时间复杂度为O(n2)
{
int * nn= new int[2];
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
if(m==num[i]+num[j])
{
nn[0]=i;
nn[1]=j;
//cout<<"i: "<<i<<endl<<"j: "<<j<<endl;
return nn;
}
}
}
}
//map 的算法
int * fangfa_2(int num[],int n,int m)
{
int * nn= new int[2];
//建立一个map
map<int ,int>pos;
for(int i=0;i<n;i++)
{
int kk=m-num[i];
if((pos.count(kk))==1)//这个函数是统计 key 的数量 只有 1和 0的返回值
{
//存在的话,我们使用迭代器把他找出来
map<int, int>::iterator f = pos.find(kk);
if (f != pos.end())
{
nn[0]=f->second;
nn[1]=i;
return nn;
}
}
pos.insert(pair<int, int>(num[i], i));//插入数据
}
return new int[0];
}
int main()
{
int num[100]={1,2,3,4,5,6,70,80,19,29};
int *bb=fangfa_1(num,10,30);
cout<<"第一个: "<<bb[0]<<" "<<"第二个: "<<bb[1]<<endl;
delete bb;
int *aa=fangfa_2(num,10,30);
cout<<"第一个: "<<aa[0]<<" "<<"第二个: "<<aa[1]<<endl;
delete aa;
return 0;
}
map 的知识
代码:
//先补充一下 map 的知识
//头文件 #include<map>
// using namespace std;
//map 基本知识
//map中所有的元素都是pair对
//pair中第一个元素是 key(键值),起到索引的作用,第二个元素是 value(实值)
//map/multimap属于关联式容器,底层结构是用二叉树实现的
//可以根据 key 值快速找到 value 值
//建造一个 map
//方法 map <int ,int >pp ; // 类型 int ,int 可以随意的写 pp 是建好的map 类型的变量名字
//声明一个迭代器 /这个主要用来在map 里面寻找要寻找的 key
//map<int, int>::iterator it
//遍历 map 并且输出
/*
void display(map<int, int>mp)
{
for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++)
{
cout << "key值:" << it->first << "value值:" << it->second << endl;
}
cout << endl;
}
*/
//map 插入数据
//pp.insert(pair<int, int>(1, 23));
//pp.insert(pair<int, int>(66, 45));
//pp.insert(pair<int, int>(10, 63));
//pp.insert(pair<int, int>(52, 37));
/*
map的插入和删除
insert(elem);在容器中插入元素
clear();清空所有元素
erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(key);删除容器中值为key的元素
*/
//代码:
/*
//map的插入和删除
void test03() {
//插入(四种插入)
map<int, int>mp;
//第一种
mp.insert(pair<int, int>(10, 520));
//第二种
mp.insert(make_pair(21, 666));
//第三种
mp.insert(map<int, int>::value_type(1, 999));
//第四种
mp[16] = 1314;
display(mp);
//删除
mp.erase(mp.begin());//删除第一个key
display(mp);
mp.erase(21); //删除 ky==21 的元素
display(mp);
//清空
mp.clear(); //清空所有的 key
//或者
//mp.erase(mp.begin(), mp.end());
display(mp);
}
*/
//map find(key);查找key是否存在,返回该键的元素的迭代器;若不在,返回map.end();
/*
int findd(map<int,int>mp)
{
map<int, int>::iterator f = mp.find(66);
if (f != mp.end())
{
cout << "找到该元素!" << endl;
cout << "key:" << f->first << " value:" << f->second << endl;
return f->second;
}
else {
cout << "没找到!" << endl;
return -1;
}
}
*/
//count(key);统计key的元素个数(0或1)
/*
int cnt1 = mp.count(66);
int cnt2 = mp.count(60);
cout << "key=66的个数:" << cnt1 << endl;
cout << "key=60的个数:" << cnt2 << endl;
*/
//map排序
/*
//仿函数
class Compare {
public:
bool operator()(int a, int b)const {
return a > b;
}
};
//map排序
void test05() {
//默认构造函数
map<int, int>mp;
//给mp插数
mp.insert(pair<int, int>(1, 23));
mp.insert(pair<int, int>(66, 45));
mp.insert(pair<int, int>(10, 63));
mp.insert(pair<int, int>(52, 37));
mp.insert(pair<int, int>(52, 38));//这个不会存进去
mp.insert(pair<int, int>(100, 520));
//打印输出
display(mp);
//更改规则的map
map<int, int, Compare>mp2;
mp2.insert(make_pair(1, 23));
mp2.insert(make_pair(66, 45));
mp2.insert(make_pair(10, 63));
mp2.insert(make_pair(52, 37));
mp2.insert(make_pair(52, 38));//这个数不会被插入
mp2.insert(make_pair(100, 520));
//打印输出
for (map<int, int, Compare>::iterator it1 = mp2.begin(); it1 != mp2.end(); it1++) {
cout << "key值:" << it1->first << " " << "value值:" << it1->second << endl;
}
}
*/