面试算法 两数之和,无序数组 ,找到返回数组

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;
	}
}



*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值