算法设计与分析学习笔记(一)

题目(一)

输入包含n个整数是数组A和整数x,求出满足A[i] + A[j] = x的i和j,如果没有这样的元素和,则返回-1,否则返回1

//暴力法

思路:
设置两个for循环,第一个设置基准数,然后利用已知数x减去基准数之后,
再使用一个for循环来进行匹配减去得到的数,如果存在该数,则返回1.如果不存在,
则继续找下一个基准数,直到可找的基准数没有,如果最后还是没有,则返回-1;
时间复杂度:O(n*2)

int  Funtion1(int a[],int n,int x){
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if(x-a[i]==a[j]&&a[i]<=x)
				return 1;
	
	return -1;		
}

//二分法
思路:
首先对整个数组进行排序,这时采用二分形式进行查找,是否存在a[i]+a[j]=x
如果a[i]+a[j]>x; 则a[j]较大,这时j–
如果a[i]+a[j]<x; 则a[i]较小,这时i++
如果 a[i]+a[j]=x; 则返回1;
否则返回-1
时间复杂度O(n)

	int Funtion2(int a[],int n,int x){
	sort(a,a+n);  //排序 
	int i=0,j=n-1;
	
	while(i<j){
		if(a[i]+a[j]<x){
			i++;
		}else if(a[i]+a[j]>x){
			j--;
		}else{
			return 1;
		}
	}
	
	return -1;
} 

//hash法

思路:
将数组中的数据存在hash表中,然后查找x-a[i]是否存在hash表中
时间复杂度o(n)

  int Funtion3(int a[],int n,int x){
 	map<int,int> hash;
 	for(int i=0;i<n;i++){
 		hash[a[i]]=1;
	 }
	for(int i=0;i<n;i++)
    	if(hash[x-a[i]]==1)
			return 1;
 			
 	return -1;

}

运行结果:

int main(){
	
	int A[10]={1,2,3,4,5,6,12};
	int x=12;
	printf("%d\n",Funtion1(A,10,12)) ;
	if(Funtion1(A,10,12)==1){
		printf("存在数值对");
	}else{
		printf("不存在数值对"); 
	} 
}


1
存在数值对
--------------------------------
Process exited after 2.753 seconds with return value 0
请按任意键继续. . .

题目(二)

求包含n个整数的数组A的第i小的数。

冒泡法:
思路:
使用冒泡排序,小的冒出水面,当进行到第i个数时,返回该数
最大时间复杂度 O(n)
最小时间复杂度 O(1)

 int Funtion2(int a[],int n,int x){
 	
 	int temp; 
 	for(int i=0;i<x;i++)
 		for(int j=1;j<n-i-1;j++)
 			if(a[j-1]<a[j]){
 				temp=a[j];
 				a[j]=a[j-1];
 				a[j-1]=temp;
			 }
 	return a[n-x-1];
 } 

//暴力法

思路;
先从小到大排序,在寻找第i位置的数
时间复杂度: O(n)

 int Funtion1(int a[],int n,int x){
	sort(a,a+n);
	for(int i=0;i<n;i++)
		if(i==x+1)
			return a[i];
	
}

运行结果:

int main(){
	int A[10]={1,22,3,41,5,22,17,2,19,11};
	int x = 3;
	printf("%d",Funtion2(A,10,4));
	
}

5
--------------------------------
Process exited after 2.123 seconds with return value 0
请按任意键继续. . .

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值