51nod1090三个数和为0(二分,vector)

原创 2018年04月17日 17:46:11
给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
Input
第1行,1个数N,N为数组的长度(0 <= N <= 1000) 
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9)
Output
如果没有符合条件的组合,输出No Solution。 
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
Sample Input
7
-3
-2
-1
0
1
2
3
Sample Output
-3 0 3
-3 1 2
-2 -1 3
-2 0 2

-1 0 1

自从用了vector,能不开数组,再也不开数组啦>v<

#include<bits/stdc++.h>
using namespace std;
struct nod{            //定义一个结构体 
	int a;
	int b;
	int c;
};
int cmp(nod a,nod b){
    if(a.a ==b.a){
    	if(a.b==b.b){
    		return a.c<b.c;   //按升序,排序结构体的三个数 
		}return a.b<b.b;
	}return a.a<b.a;
}
vector<int> v;
vector<nod> s;
int main(){
    int i,j,n;            //要求的是a+b+c=0;  改为求是否存在-a =b+c 
    int k,sum;
    nod g;
    while(cin>>n){
    for(i=0;i<n;i++){
     cin>>k;
	 v.push_back(k);	          //所有数据保存到数组v里面 
	}
	sort(v.begin(),v.end());      //数据排序(升序) 
	for(i=0;i<n;i++){
		sum=-v[i];                //取数组元素,原来是a,这里我们需要的是-a; 
		int l=i+1,r=n-1;          //二分搜索 
		while(l<r){
			if(v[l]+v[r]==sum){
			g.a=v[i]; g.b=v[l]; g.c=v[r];   //假如b+c==-a; 
			s.push_back(g);	                //把这组b,c,a,存入s数组(借助一个中间结构体变量g) 
			}
			if(v[l]+v[r]<sum)               //假如b+c<-a; 说明左边的数需要再大一点 
			l++;                            //左坐标右移(l++),如-3  +  2  < 0 ,, -3的右边一位是比-3大的数,右移才可能找到解 
			else
			r--;                            //一样的,b+c>-a;说明右边的数需要小一点, 
		}                                   //右坐标左移(r--),如 -2  +  3 > 0  ,, 3的左边一位是比3小的数,左移才可能找到解 
	}
	if(!s.empty()){                         //判断一下,s非空再进行输出 
		sort(s.begin(),s.end(),cmp);
		for(i=0;i<s.size();i++){
			cout<<s[i].a<<" "<<s[i].b<<" "<<s[i].c<<endl;
		}
	}
	else
	cout<<"No Solution"<<endl;     
	}
	return 0;
}

51NOD1090 3个数和为0

这道题的基本思想是尺取,题目的原型大概是给出一组数,让你找到和值为特定值的两个数的组合。(尺取法:先排序,分别用一个first指针指向第一个数,last指针指向最后一个数,如果first指着的数+la...
  • RockyHOO1209
  • RockyHOO1209
  • 2017-11-12 22:01:51
  • 74

51nod1090 3个数和为0

给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到...
  • heisetiantang
  • heisetiantang
  • 2016-03-11 21:40:06
  • 107

leetcode_15. 3Sum-求数组中三个数和为0

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un...
  • tonghuawanli
  • tonghuawanli
  • 2017-03-10 14:18:12
  • 560

输出数组中所有三个数相加为0的解

给定一个数组,有正有负,列出其中三个数和为零的组合 public class FindThree { public static void main(String[] args) { in...
  • Hero_R
  • Hero_R
  • 2016-10-29 23:10:42
  • 1576

LeetCode | 3Sum(三个数的和等于0)

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
  • a45872055555
  • a45872055555
  • 2014-08-17 10:30:53
  • 856

51nod -1090 . 3个数和为0 && 1267 . 4个数和为0

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 题意:给定n个数,问你有没有三个数之和等于0,并且按顺序输出所有的...
  • u012773338
  • u012773338
  • 2014-09-28 17:40:32
  • 989

51Nod 1090 3个数和为0 (二分

1090 3个数和为0Description给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Soluti...
  • wang2332
  • wang2332
  • 2017-04-24 00:31:18
  • 159

LeetCode 3Sum 三个数和为零的集合 C++完整程序

掌握了这样的题的要诀就好办: 1 排序 2 前面的两个小数和后面的一个大数相加比较,如果小于0,那么前面的数往前进,增大; 如果大于0,那么后面的数往前进,减小。 3 前面的数和后面的数相遇,本...
  • kenden23
  • kenden23
  • 2013-11-24 19:11:51
  • 4439

数据结构与算法[LeetCode]—3Sum 求数组中和为0 的三个数的组合

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
  • SUN20082567
  • SUN20082567
  • 2014-06-25 21:16:08
  • 1180

求数组内任意三个数相加和为零的组合

#include #include using namespace __gnu_cxx; int main() { int data[100] = {0}; srand(time(NULL...
  • wzx19840423
  • wzx19840423
  • 2017-01-24 14:45:00
  • 492
收藏助手
不良信息举报
您举报文章:51nod1090三个数和为0(二分,vector)
举报原因:
原因补充:

(最多只允许输入30个字)