如何找出数组中符合条件的数对
2014-03-10 10:51
281 查看
一个整数数组,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对,满足数对中两数的和等于N+1。
方法一:蛮力法。这是最简单的方法,枚举出数组中所有可能的数对,看其和是否为N+1,如果是,则输出。但这种方法一般效率不高。代码如下:
方法二:先对数组进行排序,然后使用二分查找法,用两个指示器front和back分别指向第一个和最后一个元素,然后从两端同时向中间遍历,直到两个指针交叉。
(1)如果A[front]+A[back]>N+1,则back- -。
(2)如果A[front]+A[back]=N+1,则计数器加1,back--,同时front++。
(3)如果A[front]+A[back]<N+1,则front++。
重复上述步骤,O(n)时间就可以找到所有数对。
程序代码如下:
效果如图:
方法一:蛮力法。这是最简单的方法,枚举出数组中所有可能的数对,看其和是否为N+1,如果是,则输出。但这种方法一般效率不高。代码如下:
#include "stdafx.h" #include <stdio.h> int findCouple(int a[], int n, int &val) { if (a == NULL || n <= 0) return -1; int max = a[0]; for (int m = 1; m < n; m++) { if (a[m]>max) max = a[m]; } for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { if (a[i] + a[j] == max + 1 && a[i] != a[j]) val++; } } return val; } void main() { int a[] = { 1, 2, 3, 4, 5 }; int len = sizeof(a) / sizeof(int); int val = 0; printf("%d", findCouple(a, len, val)); getchar(); }
方法二:先对数组进行排序,然后使用二分查找法,用两个指示器front和back分别指向第一个和最后一个元素,然后从两端同时向中间遍历,直到两个指针交叉。
(1)如果A[front]+A[back]>N+1,则back- -。
(2)如果A[front]+A[back]=N+1,则计数器加1,back--,同时front++。
(3)如果A[front]+A[back]<N+1,则front++。
重复上述步骤,O(n)时间就可以找到所有数对。
程序代码如下:
#include "stdafx.h" #include <stdio.h> void FixedSum(int* a, int n, int d) { if (a == NULL || n <= 0) printf("数组中无元素,找个毛啊。"); else { for (int i = 0, j = n - 1; i < n&&j >= 0 && i < j;) { if (a[i] + a[j] < d) i++; else if (a[i] + a[j] == d) { printf("%d,%d\n", a[i], a[j]); i++; j--; } else j--; } } } int main() { int array[] = { 1, 2, 3, 4, 5 }; int len = sizeof(array) / sizeof(array[0]); FixedSum(array, len, 6); getchar(); return 0; }
效果如图:
相关文章推荐
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- 算法-数组:找出符合某条件的最大矩形区域
- 找出数组中符合条件的数对的个数
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 如何在排序数组中,找出给定数字出现的次数
- 一个1~n的自然数的乱序数组,其中缺失了1到n之间的某个数,如何快速找出这个数?
- Java如何找出数组中重复的数字
- 如何找出数组中重复次数最多的数
- 如何找出相邻3条记录都满足同一条件(How to find out 3 continuous records all reach the same condition)
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- JavaScript 数组中查找符合条件的值
- J2EE面试题之 java如何找出一个int数组中出现次数最多的数字以及出现次数?
- 如何在O(N)的时间复杂度内找出数组中出现次数超过了一半的数
- 根据指定日期段找出符合条件的日期,例如指定日期段里是星期一,星期二,星期三的是是哪些天
- LeetCode刷题记录7-从数组中找出指定条件的3个数字
- 由n个元素组成的数组,n-2个数出现了偶数次,两个数出现了奇数次,且这两个数不相等,如何用O(1)的空间复杂度,找出这两个数
- 程序员面试题目总结--数组(四)【数列中符合条件数对的个数、数组是否存在重复元素、重新排列数组使数组左边为奇数,右边为偶数、数组中的第二大数、数组中的最小值和最大值】
- MongoDB查询内嵌数组(限定返回符合条件的数组中的数据)(1)
- 如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数
- 如何找出数组中第二大的数