1090 3个数和为0
基准时间限制:1秒 空间限制:131072KB 分值: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

问题链接:51Nod-1090 3个数和为0

问题分析:数进行排序后,两次查找,最后使用二分查找。

程序说明

设查找的数为x+y+z,那么x+y+z=0。

x用枚举试探,可以是a[0]-a[n-2-1]之一。

对于y,若x=a[i]则y可以是a[i+1]-a[n-1-1],逐个试探。

最后用z=-(x+y)进行二分查找,若y=a[i]则z可以是a[i+1]-a[n-1]之一。

题记:(略)

参考链接:51Nod-1001 数组中和等于K的数对【排序+二分查找】

AC的C++程序如下:

#include <iostream>
#include <algorithm>
#include <stdio.h>using namespace std;const int N = 50000;
int a[N];
int n, x, y, z;
bool flag;bool search(int v, int start)
{int end = n - 1, mid;bool sflag;sflag = false;while(start <= end) {mid = (start + end) / 2;if(a[mid] == v) {sflag = true;break;} else if(a[mid] < v)start = mid + 1;else if(a[mid] > v)end = mid - 1;}return sflag;
}void search2(int start)
{for(int i=start; i<n-1; i++) {y = a[i];z = -(x + y);if(a[i + 1] <= z && search(z, i + 1)) {printf("%d %d %d\n", x, y, z);flag = false;}}
}int main()
{scanf("%d", &n);for(int i=0; i<n; i++)scanf("%d", &a[i]);sort(a, a+n);flag = true;for(int i=0; i<n-2; i++) {if(a[i] >= 0)break;x = a[i];search2(i + 1);}if(flag)printf("No Solution\n");return 0;
}

51Nod-1090 3个数和为0【排序+二分查找】相关推荐

  1. 51nod 1267 4个数和为0 思路:哈希map+避免重复的点

    题目: 总结大佬们的思路: 思路1:所有数两两求和,存入map中,每次判断有没有相反数被标记过. 思路2:对所有数排序,排完所有数两两求和,结果正好是排好序的.然后扫一遍,二分查找看之前有没有相反数存 ...

  2. [51nod] 1267 4个数和为0

    1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes&q ...

  3. problem k: 查找某一个数_quot;细节魔鬼quot; 二分查找

    ❝ 二分查找,是一个高效,实用,且易理解的一个查找算法, 通常时间复杂度为O(lgn).局限性在于,待查找对象必须为有序的数组:数据量过小,优势不明显,数据量过大,数组大小受限于内存. 除此之外,二分 ...

  4. LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

    1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...

  5. 51Nod-1001 数组中和等于K的数对【排序+二分查找】

    1001 数组中和等于K的数对 基准时间限制:1秒 空间限制:131072KB 分值:5难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对. ...

  6. StringBuffer+排序+二分查找+包装类+正则表达式+常用类

    一.StringBuffer 1.概述 我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题StringBuffe ...

  7. 数据结构/算法笔记(1)-两种排序 二分查找

    快速排序 确定分界点:在数组中选一个元素的值 x x x 作为分界,(某人说)可任取 (重点)调整区间:以 x x x 为准,将数组分为左右两段,通过换位保证左边都≤x,右边都≥x,即可 递归分别处理 ...

  8. LeetCode LCP 28. 采购方案(排序 + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 小力将 N 个零件的报价存于数组 nums. 小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案. 注 ...

  9. 【数据结构与算法】task3 排序二分查找

    排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...

最新文章

  1. C++对象赋值的四种方式
  2. P1209 [USACO1.3]修理牛棚 Barn Repair(贪心+逆向思维)难度⭐⭐⭐
  3. 如何发现数据中的异常值?对异常值是怎么处理的?
  4. linux升级内核后反复重启,Ubuntu 14.04 升级内核后重启开机黑屏解决
  5. python安装pandas模块-python安装numpy和pandas的方法步骤
  6. 【CV】图像分析用 OpenCV 与 Skimage,哪一个更好?
  7. Django缩略图实现
  8. CentOS7安装ipython
  9. 如何停止一个正在运行的java线程
  10. (图文详细)如何使用Code::Blocks运行c/cpp文件?
  11. Linux操作系统内核启动参数详细解析[转]
  12. 不学点《近世代数》怎么学好现代密码学
  13. 数论概论笔记 第3章 勾股数组与单位圆
  14. 面试复盘:2020.09.09
  15. python将中文汉字转换成拼音
  16. 萝卜干煎蛋,榨菜,白粥,很美丽
  17. mesh 协调器 路由器_为什么WiFi6和MESH是绝配
  18. 用HTML制作用户注册网页
  19. C++面向对象程序设计实验题:有理数类(分数类)设计
  20. Java实现 蓝桥杯 算法提高 Monday-Saturday质因子

热门文章

  1. ArcGIS GDB中要素类不可编辑
  2. sass-loader高版本的坑
  3. mysql 5.5 主从_Mysql5.5常用命令及主从配置
  4. arduino eeg脑电模块_应用深度学习EEGNet来处理脑电信号
  5. onepill Android端
  6. linux下载镜像的命令wget,Linux wget命令整站下载做网站镜像
  7. 为什么应尽量从列表的尾部进行元素的增加与删除操作?
  8. 第八届蓝桥杯第八题日期问题
  9. 机器学习代码实战——K折交叉验证(K Fold Cross Validation)
  10. 剑指offer面试题22. 链表中倒数第k个节点(链表)