题目:一个整型数组,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
方法一:排序+二分查找。先对数组进行排序,然后遍历该有序数组,同时使用二分查找方法,查找对应的值是否存在(例如,有序数组中某元素值为a,那么在该有序数组中,使用二分查找方法,来查找(N+1- a)是否存在)。

方法二:排序+线性扫描。先对数组进行排序,然后使用两个指示器(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)时间就可以找到所有数对,因此总体复杂度为O(nlogn)。
通过给出一个有序数组,来观察方法二的实现,如下:

#include <iostream>void FindSum(int arr[], int len, int sum)
{int i,j;for (i = 0, j = len - 1; i < len && j >= 0 && i < j;){if (arr[i] + arr[j] < sum)i++;else if (arr[i] + arr[j] == sum){printf("%d + %d = %d\n", arr[i], arr[j], sum);i++;j--;}elsej--;}
}int main(int argc, const char * argv[]) {int arr[] = {1,2,3,4,5,6};int len = sizeof(arr)/sizeof(int);FindSum(arr, len, 8);return 0;
}

方法三:hash法。即使用hash法,对数组进行计数排序,将1~N个数放在一块很大的空间里面,比如1放在1号位,N放在n号位置,然后对每个数m,在hash表中寻找“下标N+1- m 对应的值是否存在“,若存在,则构成一对满足要求的数对。总体时间复杂度为O(n)。

拓展一:
如果是任意数组,而不是本题的有规律数组,如何求解数组对?即给定一个任意整数数组array[n],寻找数组中和值为SUM的数对。(方法同上)
方法一:排序+二分查找。先对数组进行排序,然后遍历该有序数组,同时使用二分查找方法,查找对应的值是否存在(例如,有序数组中某元素值为m,那么在该有序数组中,使用二分查找方法,来查找(SUM - m)是否存在)。

方法二:排序+线性扫描。先将数组排序后(一般最快的排序算法时间复杂度为O(nlogn)),然后设两个指针指向数组的两端,判断这两个指针对应元素之和是否为SUM,如果等于SUM,则找到了,继续查找;如果小于SUM,那么首指针递增;如果大于SUM,尾指针递减,直到两个指针相遇时,如果还是没有和为SUM的元素对出现,那么返回false。

方法三:hash法。将数组存储到hash表中,对每个数m,在hash表中寻找SUM - m,此时时间复杂度为 O(n)。需要注意的是,如果数组空间很大,超过了内存的容量,那么可以按照hash(max(m, SUM - m))%g,将数据分到g个小的组中,然后对每个小组进行单独处理,此时时间复杂度还是O(n)。

拓展二:
已知大小分别为 m、n 的两个无序数组 A、B 和一个常数 c,求满足A[ i ] + B[ j ] = c 的所有 A[ i ] 和 B[ j ]。(方法同上)
方法一:排序+二分查找。首先,对两个数组中较大数组(假设为 A)排序;然后,对 B 中每个元素 B[ i ] 在 A 中二分查找 c - B[ i ],如果找到,直接输出。此方法的时间复杂度为 O(mlogm + nlogm)。

方法二:排序+线性扫描。首先,对两个数组 A 和 B 进行排序;然后用指针 p 从头扫描 A,用指针 q 从尾扫描 B,如果 A[ p ] + B[ q ] == c,则输出 A[ p ] 和 B[ q ],且p++,q++;如果 A[ p ] + B[ q ] > c,则 q–;否则 p++。时间复杂度为O(mlogm + nlogn)。

方法三:hash法。首先,将两个数组中较小的数组(假设为A)保存到hash表中,然后,对于 B 中的每个元素 B[ i ],也采用相同的hash算法在hash表中查找 c - B[ i ] 是否存在,如果存在,则输出。时间复杂度为O(m + n),空间复杂度为O(min(m, n))。

找出数组中符合条件的数对的个数相关推荐

  1. 【matlab】找出数组中符合条件的数并赋值

    matlab中寻找出array中符合要求的数的位置,并赋值 1.直接条件赋值 a = randn(10) >>> a =0.8404 -2.1384 2.9080 -0.3538 0 ...

  2. numpy找到数组中符合条件的数

    numpy找到数组中符合条件的数 import numpy as nparr = np.array([1, 1, 1, 134, 45, 3, 46, 45, 65, 3, 23424, 234, 1 ...

  3. java 算法之找出数组中第二大的数

    1.如果仅考虑实现功能而不考虑效率,可以先通过排序算法将数组排序,然后根据数组下标来访问数组中第二大的数,,最快的排序算法一般为快速排序算法,但是其时间复杂度为(nlogn),根据下标访问需要便利一遍 ...

  4. 小小c#算法题 - 1 - 找出数组中满足条件的两个数

    把一些东西放到网上,看的时候方便一些.代码可能有bug且不是最佳解决方案,仅供参考. 题目:输入一个按升序排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 ...

  5. 找出数组中其中最大的数及其下标

    1.在一个有8个整数(18,25,7,36,13,2,89,63)的数组中找出其中最大的数及其下标. 代码如下: public static void main(String[] args) {int ...

  6. 如何找出数组中第二大的数

    1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有 ...

  7. Java实现找出数组中重复次数最多的元素以及个数

    /**数组中元素重复最多的数* @param array* @author shaobn* @param array*/public static void getMethod_4(int[] arr ...

  8. 找出数组中符合某些条件的对象数组

    前言 过滤出符合某些条件的数组 一.当条件为单个时 const data = [{id: 1,topic: '难过',title: '再见只是陌生人' },{id: 2,topic: '遗憾',tit ...

  9. 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)

    1.8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下 ...

最新文章

  1. Windows Server 2008与2012建立林信任关系
  2. 【Nginx】Nginx概述
  3. SAP Customer Experience Extensibility gold rule
  4. leetcode 706. 设计哈希映射
  5. 年底了,小心这些现象。别再无动于衷
  6. 大话设计模式读书笔记10----外观模式(Facade)
  7. 10115 - Automatic Editing
  8. Chrome插件之一键保存网页为PDF1.1发布
  9. 【开源项目】Java王者荣耀游戏项目开发
  10. vsco怎么两个滤镜叠加_做图比设计师还快?!这帮饭圈女孩是怎么做到的?
  11. 如何实现Android端的录屏采集
  12. BLC(Black Level Correction)——黑电平校正
  13. 关于EL表达式获取参数的两种方法
  14. 《Cisco防火墙》一6.5 虚拟防火墙的管理访问
  15. 卸载Oracle11g的步骤
  16. Java实现数据排序
  17. 高斯消去法的python实现
  18. python求梅森尼数_python3算梅森素数的最佳代码是什么?
  19. 实验室每日一题 2020.11.30
  20. 【机器学习】李宏毅——Flow-based Generative Models

热门文章

  1. 欧洲央行“政策宣示”,数字欧元的推出已经是箭在弦上
  2. 部分窗帘甲醛残留多会损害健康
  3. android开发回合制游戏,10款安卓手机回合制网游排行榜
  4. Anaconda3修改默认环境保存路径
  5. Android 设置虚线分割线
  6. lvgl image
  7. 牛客编程巅峰赛:Tree III(BFS or DFS)
  8. Android Animation动画原理源码分析
  9. mongodb中带条件的文档--$gte、 $gt、$lte、$lt、 $eq、 $ne、distinct、与、或($or),$in、$exists
  10. Task6 信念与价值量表(BVI) CFA