已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]
方法一:枚举法。该方法是最容易、也是最简单的方法,枚举出数组A和数组B中所有的元素对,判断其和是否为c,如果是,则输出。
方法二:排序+二分查找法。首先,对两个数组中长度较大数组,不妨设为A,排序;然后,对于B中每个元素B[i]在A中二分查找c-B[i],如果找到,直接输出。
方法三:排序+线性扫描法。首先,对A和B进行排序;然后用指针p从头扫描A,用指针q从尾扫描B,如果A[p]+B[q]==c,则输出A[p]+B[q],且p++,q--;如果A[p]+B[q]>c,则q--;否则p++。
代码如下:
#include "stdafx.h"
#include <stdio.h>
void sortArray(int a[], int n)
{
if (a == NULL || n <= 0)
printf("数组中无元素,排个毛啊。");
else
{
int temp;
for (int i = 0; i < n-1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i]>a[j])
{
a[i] = a[i] ^ a[j];
a[j] = a[j] ^ a[i];
a[i] = a[i] ^ a[j];
}
}
}
}
}
void findCouple(int a[], int b[], int An, int Bn,int sum)
{
if (a == NULL || An <= 0 || b == NULL || Bn <= 0)
printf("数组中无元素,找个毛啊。");
else
{
for (int i = 0, j = Bn - 1; i < An, j >= 0;)
{
if (a[i] + b[j]>sum)
j--;
if (a[i] + b[j] == sum)
{
printf("%d,%d\n", a[i], b[j]);
i++;
j--;
}
if (a[i] + b[j] < sum)
i++;
}
}
}
void main()
{
int a[] = {1,3,1,5,2,0};
int b[] = { 1, 4, 3, 1, 0, 1 };
int An = sizeof(a) / sizeof(int);
int Bn = sizeof(b) / sizeof(int);
sortArray(a, An);
sortArray(b, Bn);
findCouple(a, b, An, Bn, 6);
getchar();
}
效果如图:
方法四:Hash法。首先,将两个数组中长度较小的数组,不妨设为A,保存到哈希表中,然后,对于B中每个元素B[i],也采用相同的hash算法在哈希表中查找c-B[i]是否存在,如果存在,则输出.时间复杂度为O(m+n),空间复杂度为O(min{m,n})。但这种算法有个问题,就是会出现重复。
代码如下:
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
void print_pairs_with_sum2(int A[], int B[], int m, int n, int sum)
{
map<int, bool> hash_table;
int *psmaller = A;
int *pbigger = B;
int nsmaller = (m >= n) ? n : m;
int nbigger = (m >= n) ? m : n;
if (m > n)
{
psmaller = B;
pbigger = A;
}
for (int i = 0; i < nsmaller; i++)
{
hash_table.insert(pair<int, bool>(psmaller[i], true));
}
for (int i = 0; i < nbigger; i++)
{
if (hash_table.find(sum - pbigger[i])!= hash_table.end())
{
cout << "(" << pbigger[i] << "," << sum - pbigger[i] << ")" << endl;
}
}
}
void main()
{
int a[] = { 1, 5, 4, 3, 2, 0 };
int b[] = { 1, 4, 3, 1, 0, 1 ,};
int m = sizeof(a) / sizeof(int);
int n = sizeof(b) / sizeof(int);
print_pairs_with_sum2(a, b, m, n, 6);
getchar();
}
效果如图:
已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]的更多相关文章
- WCF 已知类型和泛型解析程序 KnownType
数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...
- 已知ip地址和其子网掩码如何求网络号子网号主机号
已知ip地址为10.130.89.95,其子网掩码为255.255.255.224,求其网络号.子网号和主机号. 要看子网掩码变长在第几节,255.255.255.224是在第四节借了位 把224转换 ...
- 如何在在页面中清除一个已知的cookie?
前些天在写一个项目的时候,使用cookie来存储一些用户数据,在用户登出时需要清理以往的数据,对于一个初学者来说,我需要学习如何清除一个已知的cookie. 首先,引入两个js文件: 1.jquery ...
- 对象布局已知时 C++ 对象指针的转换时地址调整
在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时 ...
- 布局:高度已知,布局一个三栏布局,左栏和右栏宽度为200px,中间自适应
需求:高度已知为200px,写出三栏布局,左栏和右栏各位200px,中间自适应,如下图所示: 方法一:float浮动布局 原理是:定义三个区块,需要注意的是中间的区块放在右边区块的下面,统一设置高度为 ...
- Notes 和 Domino 已知限制
Notes 和 Domino 已知限制 功能测试 限制数据库的最大大小是多少? 最大的 OS 文件大小限制 -(最大为 64GB)文本域的最大大小是多少? 15KB(存储):15KB,显示在视图列中R ...
- 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)
TX面试题2: 已知一个含有n个元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的) 题目分析, 为了便于说明,不妨将问题简化一下: 已知一个盒子中有n个不同的球,分别标记为{a1,a2,. ...
- java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量
package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...
- 已知词频生成词云图(数据库到生成词云)--generate_from_frequencies(WordCloud)
词云图是根据词出现的频率生成词云,词的字体大小表现了其频率大小. 写在前面: 用wc.generate(text)直接生成词频的方法使用很多,所以不再赘述. 但是对于根据generate_from_f ...
随机推荐
- textbox 控制输入整数,小数
/// <summary> /// keypress事件控制输入 /// </summary> /// <param name="sender"> ...
- linux安装setup
安装setuptool #yum install setuptool 系统服务管理 #yum install ntsysv 防火墙设置.网络设置 #yum install ipt ...
- 【jquery】jquery 实现许愿墙效果,可拖拽
最近整理做过的项目,发现有个许愿墙的效果,今天拿出来给大家分享下. 先简单的介绍下功能点: 随机显示背景图或背景色 出现的位置随机 可以通过拖拽改变位置 好了,附上代码: <!doctype h ...
- 利用SpringCloud搭建一个最简单的微服务框架
http://blog.csdn.net/caicongyang/article/details/52974406 1.微服务 微服务主要包含服务注册,服务发现,服务路由,服务配置,服务熔断,服务降级 ...
- ubuntu14.04 3D桌面效果制作
参考:http://www.360doc.com/content/14/0919/22/11681374_410808557.shtml
- How MapReduce Works
转自:http://blog.csdn.net/luyee2010/article/details/8624470 一.从Map到Reduce MapReduce其实是分治算法的一种实现,其处理过程亦 ...
- 【WPF】WPF DataGrid List数据源 双向绑定通知机制之ObservableCollection使用以及MultiBinding 的应用
以下代码实现了DataGrid的简单绑定List数据源 重点要提一下的是,绑定List数据源,但是不能直接用List.比如下面的代码,使用List<GridItem>只能实现数据修改的绑定 ...
- 使用Camera功能 AREA的理解
转至 http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Paramet ...
- Wings 3D
Wings 3D 编辑 Wings 3D 是一个开源的三维计算机图形软件.使用翼边数据库.注重于多边形建模,构思取与 Izware 的 Nendo 和 Mirai.支持多种操作系统,包括 Linux. ...
- QTreeView
隐藏左侧的小箭头