1090 3个数和为0
基准时间限制:1 秒 空间限制:131072 KB 分值: 5
难度:1级算法题
给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
Input
第1行,1个数N,N为数组的长度(0 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果没有符合条件的组合,输出No Solution。
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
Input示例
7
-3
-2
-1
0
1
2
3
Output示例
-3 0 3
-3 1 2
-2 -1 3
-2 0 2
-1 0 1
先对所有数字进行排序,然后从最小的数依次向后查询,然后第二个数从第一个数之后一个个尝试,但第三的可以用二分查找,看是否存在,
//非二分法
#include <cstdio>
#include <algorithm>
using namespace std ;
int a[1010];
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a+n);
bool flag=0;
for(int i=0; i< n && a[i]<0; i++)
{
int j=i+1, k=n-1;
while(j< k && j< n)
{
while(a[i]+a[j]+a[k]<0)
{
j++;
}
while(a[i]+a[j]+a[k]>0)
{
k--;
}
if(j>= k) break;
if(a[i]+a[j]+a[k]==0)
{
flag=1;
printf("%d %d %d\n", a[i], a[j], a[k]);
j++; k--;
}
}
}
if(!flag)
{
printf("No Solution\n");
}
}
return 0;
}//二分法#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int binary_search(int* a, int low ,int len, int goal)
{
// int low = 0;
int high = len - 1;
while(low <= high)
{
int middle = (low + high)/2;
if(a[middle] == goal)
return middle;
//在左半边
else if(a[middle] > goal)
high = middle - 1;
//在右半边
else
low = middle + 1;
}
//没找到
return -1;
}
int main()
{
int num[1010]={0};
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
sort(num,num+n);
int flag=0;
int tn=0;
for(;tn<n;tn++)
if(num[tn]>=0)break;
for(int i=0;i<tn;i++)
{
for(int j=i+1;j<n;j++)
{
int temp=0-num[i]-num[j];
int result=binary_search(num,j+1,n,temp);
if(result!=-1)
{
flag=1;
if(num[i]<num[j]&&num[j]<temp)
cout<<num[i]<<" "<<num[j]<<" "<<temp<<endl;
}
}
}
if(flag==0)
cout<<"No Solution"<<endl;
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-676611.html