面试算法 牛客题目 BM50 两数之和

1.题目:BM50 两数之和
描述:
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)


2.算法:

1.暴力算法

2.哈希算法


3.算法思想

对于本题,具体解题思路为(如图所示):

  1. 定义哈希表hashmap,其存放的键值对为<取值,下标>。

  2. 从开始处遍历数组,对于第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;
} 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值