输入包含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]
否则返回-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
请按任意键继续. . .