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