寻找和为定值的两个数

1. 题目描述

给定一个数组(无序或者有序,两种情况都要考虑),找出和为M的两个数。最多时间复杂度能有多少?

https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.02.md

2. 数组有序——两端指针扫描法

数组有序的情况,在时间复杂度上我们就省去了排序的O(NlogN)。

我们使用两端指针扫描法是比较简单的,时间复杂度为O(N), 空间复杂度为O(1)。如下图所示:

首先我们在数组两端分别放上一个标志:head, tail。

然后,判断它们指向的值之和sum是否等于M,

如果sum==M, 记录结果!head, tail同时往中间移动一次;

如果sum<M, tail往中间移动一次;

如果sum>M, head往中间移动。

直到,head>tail,返回结果~

总共的时间复杂度就是很厉害的O(N), 空间复杂度也只是O(1)。但是注意前提是数组要有序~

程序如下:

3. 数组无序——映射hash表或者数组

当数组无序的时候,当时我们可以先排序, 然后再使用上面的方法。这是时间复杂度为O(NlogN),空间复杂度为O(1)。

或者我们还可以使用映射hash表或者数组,详细来说:

把数组M - a[i]映射到一个hash表或者是一个数组,然后我们就判断原数组和数组M - a[i]时候有元素相等,如果则返回结果。判断相等的方法我们也可以使用两端夹逼方法。

这种方法的时间复杂度为O(N), 空间复杂度为O(N)。

ps:其实在无序的情况,还是映射到hash表比较好,映射到数组也不是很好操作~

#include <iostream>
using namespace std;
const int size=100;

int main()
{
    int hashtable[size];
    for(int i=0;i<size;i++)
        hashtable[i]=0;
    int a[size]={1,2,4,5,7,11,15};
    for(int i=0;i<7;i++)
        hashtable[a[i]]=1;
    int sum=15;
    for(int i=0;i<7;i++)
        if(hashtable[i]&&hashtable[sum-i])
          cout<<"这两个数为"<<i<<" "<<sum-i<<endl;
        else
          cout<<"不存在这样的两个数."<<endl;
    return 0;
}
时间: 2025-01-15 01:21:29

寻找和为定值的两个数的相关文章

算法笔记_037:寻找和为定值的两个数(Java)

目录 1 问题描述 2 解决方案 2.1 排序夹逼法   1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和整数15,那么由于4+11 = 15,因此输出4和11. 2 解决方案 2.1 排序夹逼法 首先将整数数组,使用合并排序进行从小打到的排序,然后对这个排完序的数组从两头往中间遍历,一旦出现两个数的和等于输入的那个整数,则立即输出这两个数,并结

寻找和为定值的多个数

1.首先看看简单的,寻找和为定值的2个数求解 采用HASH方式就可以求解. 具体参考这个文章: 寻找和为定值的2个数 2.那寻找和为定值的多个数怎么求解了 #include <stdio.h> #include <stdlib.h> /*原题:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 修改之后改为:对任意一个数组寻找m个数,使其和为指定的值*/ void findSubSum(int* a, int

编程之法:面试和算法心得(寻找和为定值的多个数)

内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来. 分析与解法 解法一 注意到取n,和不取n个区别即可,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题. 如果取第n个数,那么问题就转化为"取前n-1个数使得它们的和为sum-n",对应的代码语句就是sumOfkNumber(sum - n, n - 1): 如果

编程之法section II: 2.2 和为定值的两个数

====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路:开散列映射,空间换时间, 查找耗时o(n) Writer: zzq Function: 求和为定值的两个数. 方法一: 开散列映射(哈希表). 1) 用哈希表Hashmap先把数组中的数字和对应的下标进行存储,(键,值)=(具体数值,对应下标): 2) 遍历数组,对loss=target-nums[

【剑指offer学习】求和为定值的两个数(拓展)

接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有为非负整数,相同给定一个数sum,在数组中找出随意两个数,使二者的和为sum. 分析: 由于题目中限定了数组中的元素为非负整数,因此我们能够用哈希数组,开辟一个长度为sum的bool数组B[sum],并所有初始化为false,对数组A进行一次遍历,假设当前的元素A[i]大于sum,则直接跳过,否则,

数组中找到和为给定值的两个数

problem 167 & 170 from leetcode; https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/ https://leetcode.com/problems/two-sum-iii-data-structure-design/ 先来看简单的167:给定一个排好序的数组,以及一个值,找出数组中相加等于该值的两个数,假设这样的值始终存在: 这个只要依次遍历该数组,假设当前值为x,那么只需要在数组中找到va

和为定值的两个数

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出“-1 -1” 样例输入: 6 15 1 2 4 7 11 15 样例输出: 4 11     思

【剑指offer学习】求和为定值的两个数

<神雕侠侣>中的'剑冢',收存着'剑魔独孤求败'生平用过的三把剑:"杨过提起右首第一柄剑,只见剑下的石上刻有两行小字'凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋':第二把是玄铁重剑:'重剑无锋,大巧不工.四十岁前恃之横行天下':第三把则是木剑,剑下的石刻道:'四十岁后,不滞于物,草木竹石均可为剑.自此精修,渐进于无剑胜有剑之境.'.算法的精髓也在于此,只有突破一层层境界,才能有所突破. 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有

[LeetCode]1. Two Sum 数组中和为特定值的两个数

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that