#include<stdio.h>
#include<windows.h>
int main(){
int a[]={1,4,5,6,7,2,3};
int sum=8;
int number=sizeof(a)/sizeof(a[0]);
for (int i=0;i<number;i++){
for (int j=0;j<number;j++)
{
if((sum==(a[i]+a[j]))&&(i!=j))
{
printf("%d",a[i]);
printf("%d\n",a[j]);
}
}
}
return 0;
}
时间复杂第是O(n^2);这样的代码是远远不能打动面试官;
更好的办法:
先将整型数组排序,排序之后定义两个指针left和right。left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素,将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--;若前者小,left++;若相等,则找到了一对整数之和为指定值的元素。此方法采用了排序,排序的时间复杂度为O(NlogN),排序之后扫描整个数组求和比较的时间复杂度为O(N)。故总的时间复杂度为O(NlogN),空间复杂度为O(1)。
#include<stdio.h>
#include<windows.h>
int main(){
int a[]={1,2,3,4,5,6,7,8,9};
int sum=8;
int number=sizeof(a)/sizeof(a[0]);
int low=0;
int hight=number-1;
while(low<hight){
if((a[low]+a[hight])>sum)
{
hight--;
}
else if((a[low]+a[hight])<sum){
low++;
}
else{
printf("%d%d\n",a[low],a[hight]);
low++;
hight--;
}
}
return 0;
}