剑指offer面试题57 :和S的数字

非科班的女渣硕士,用博客记录一下自己学的东西,有些错误还望大家指点,谢谢!
题目
输入一个数组和一个数字s,在数组中查找两个数,使得他们和正好为s,如果有多对数字和等于是,输出任意一对即可

new 创建一个动态数组

int *f=new int [10], delete [] f

求数组的长度

`int num=sizeof(data) /sizeof(data[0]);`
#include<iostream>
using namespace std;
//O(n*n) 的方法 
 int* FindNumbersWithSum(int data[],int num,int sum,int find[])
{
  if (num<1|| data==NULL)
  {
  	 return NULL;
  	
  } 
     find=new int [2];
  bool find_flag=0;
	for(int i=0;i<num;i++)
  {
  	for(int j=0;j<num;j++)
  	 if(sum-data[i]==data[j])
  	 
	   {
	   int *find=new int [2];
	   find[1]=data[i];
	   find[0]=data[j];	
	   find_flag=1;
	    cout<<find[0]<<endl;
        cout<<find[1]<<endl;
        return find;
        
	    break;	
	   }
	   if(find_flag)
	   {
	   		break;	
	   }
  }	  
    if(find_flag)
	   {
	   	return NULL;	
	   }

	
}
int main()
{
	int data[10]={1,2,3,4,5,2};
	int num=sizeof(data) /sizeof(data[0]);
	int *find=NULL;// 先进行一个初始化的过程 
	int sum=3;
	find=FindNumbersWithSum(data,num,sum,find);
	cout<<*find<<endl;
        //cout<<find[1]<<endl;
    delete []find; // 应该在外面进行一个delete // 当你想返回数组的时候为了不跨函数进行new 和delete 最好直接在函数里面进行传参数 
}
// 这个是最暴力的方法,这样的话复杂度为n*n 

上面方法的复杂程度太高了,还有一种方法就是先对数组进行排序,然后使用两个指针进行判断

#include<iostream>
using namespace std;
//先排序的方法 
 int* FindNumbersWithSum(int data[],int *pHead,int *pEnd,int sum,int result[],int num)
 {
 	
 	 if (num<1|| data==NULL)
 	 {
 	 	return NULL;
 	 	
 	 }
  
     while(pHead<pEnd)
     
     
     {
     	if(*pHead+*pEnd==sum)
     	{
     		
     		int *result=new int [2]; //注意new  int [2] 而不是int a[2]开辟动态数组 
	        result[0]= *pHead;
	        result[1]= *pEnd;
         	return result; 
         	break;   	
     	} 
     	else if(*pHead+*pEnd<sum)
     	    {
     	    	pHead++;
     	    }
     	    else
     	    pEnd--;
      }
     	
}
 int Sort(int data[],int num)
{
	for(int i=0;i<num-1;i++)// 两两比较的操作次数 
	{
		
		for(int j=0;j<num-i-1;j++)//冒泡排序的思想是前一个和后一个对比,最后固定了i个 
		{
			
			if(data[j]>data[j+1])
			{  // cout<<j<<endl;
			//cout<<data[j+1]<<endl;
				int temp=data[j+1];
				data[j+1]=data[j];
				data[j]=temp;		
			}
          			
		}	
	}
}
 int main()
{
	int data[10]={1,2,3,4,5,6,19,5,2,10};
	int num=sizeof(data) /sizeof(data[0]);
	int *result=NULL;// 先进行一个初始化的过程 
	int *pHead,*pEnd;
	pHead=data;
	pEnd=pHead;
	int j=0; 
	while(j<num)
	{
		pEnd++;
		j++;	
	} 
	pEnd--;// 这一行要注意加上 
	cout<<*pEnd<<endl;
	int sum=5;
	Sort(data,num);//排序 
	
	j=0;
//	while(j<num)
//	{
//		cout<<data[j]<<endl;
//		j++;
//		
//	}
	result=FindNumbersWithSum(data,pHead,pEnd,sum,result,num);
	cout<<result[0]<<endl;
	 cout<<result[1]<<endl;
    delete []result; 
	return 0;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值