面试算法 两数之和2 ,升序数组

1.题目:
给定一个升序排列的整数数组numbers,从数组中找出两个数满足相加之和等于目标数 target 。
假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组形式返回.


2.算法

1.暴力二分法

2.双指针算法


3.算法思想:(看代码!!!,这个你看不懂)


//暴力二分算法
// 我们要找到两个数 x , y 的值  等于  一个数 m   找到的话,我们返回包含两个数的下标的数组 
//所以我们先用    m-x, 这时候我们就只要在数组中找到 y=m-x 的值 ,就行了。
//所以我们建立一个循环  遍历数组 在数组中 寻找 y 的值 , 这时候我们寻找的方法有多种!
/* 寻找方法 
1.暴力循环遍历寻找   (用时最长)
2.在之前的时候  使用桶排序寻找  (我认为这个是最方便 (但是怕数太大,方法不行))(两个循环   时间复杂度O(n)  首先把数存入桶的数组,再循环查询) 
3.暴力二分寻找    (用时最少)--->这里我们使用这个 
*/ 

//2.双指针算法
//开始定义两个指针标记--> 这里是整形的数组  
//开始 一个指针指向最小的数   一个指针指向最大的数  (这里是升序的数组)
// 算法思想:   x ( 最小的 )+ y(  最大的数 ) =  m  (要求的数)
// x  + y  =  m   的算法   因为  左右遍历,可以查看所有的结果
//假如  num[x] 小了    变为num[ x+1]    num[y]大了,  变为num[y-1]
//除非结果没有,不然一定会找到


4.代码:

/*************************************************
作者:she001
时间:2022/8/25
内容: 给定一个升序排列的整数数组numbers,从数组中找出两个数满足相加之和等于目标数 target 。
假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组形式返回.

***************************************************/
#include<iostream>
#include<map> 
using namespace std;

//暴力二分算法
// 我们要找到两个数 x , y 的值  等于  一个数 m   找到的话,我们返回包含两个数的下标的数组 
//所以我们先用    m-x, 这时候我们就只要在数组中找到 y=m-x 的值 ,就行了。
//所以我们建立一个循环  遍历数组 在数组中 寻找 y 的值 , 这时候我们寻找的方法有多种!
/* 寻找方法 
1.暴力循环遍历寻找   (用时最长)
2.在之前的时候  使用桶排序寻找  (我认为这个是最方便 (但是怕数太大,方法不行))(两个循环   时间复杂度O(n)  首先把数存入桶的数组,再循环查询) 
3.暴力二分寻找    (用时最少)--->这里我们使用这个 
*/ 

int *  fangfa_1(int num[],int n,int m)
{
	int * nn = new int[2];
	for(int i=0;i<n;i++)
	{
		int low =i;
		int high=n-1;
		while(low<=high)
		{
			int mid =(high-low)/2+low;// mid 是实际的地址 
			if((num[mid])==(m-num[i]))
			{
				
				nn[0]=i;
				nn[1]=mid; 
				return 	nn;
			}
			else if(num[mid]>(m-num[i]))
			{
				high=mid-1;
			} 
			else
			{
				low=mid+1;
			}
		}	
	}
	return nn;
	
} 

//2.双指针算法
//开始定义两个指针标记--> 这里是整形的数组  
//开始 一个指针指向最小的数   一个指针指向最大的数  (这里是升序的数组)
// 算法思想:   x ( 最小的 )+ y(  最大的数 ) =  m  (要求的数)
// x  + y  =  m   的算法   因为  左右遍历,可以查看所有的结果
//假如  num[x] 小了    变为num[ x+1]    num[y]大了,  变为num[y-1]
//除非结果没有,不然一定会找到
int* fangfa_2(int num[],int n,int m)
{
	//cout<<"m="<<m<<endl;
	int *nn=new int[2];
	int low=0;
	int high=n-1;
	while(low<high)
	{
		int sum=num[low]+num[high];
		if(sum==m)
		{
			nn[0]=low;
			nn[1]=high;
			return nn;
		}
		else if(sum>m)
		{
			high--;
		}
		else if(sum<m)
		{
			low++;
		}
	}
	return nn;
} 

 
int main()
{
	int num[]={1,2,4,5,7,8,10,14};
	int * gg=fangfa_1(num,8,13);
	cout<<"第1个:= "<<gg[0]<<endl<<"第二个:"<<gg[1]<<endl;
	
	int * gg1=fangfa_2(num,8,13);
	cout<<"第1个:= "<<gg1[0]<<endl<<"第二个:"<<gg1[1]<<endl;	
	return 0;
} 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值