两数之和等于x

算法导论第2.3-7的习题中要求给出一个运行时间为O(nlgn)的算法,这个算法的功能是能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在两个其和等于x的元素。

方法一:都知道在一个有序的序列中使用二分查找的时间复杂度是O(lgn)。首先排序,那么我们可以枚举集合S中的每一个元素,然后使用二分查找算法查找x-y(y是S中的一个元素),那么这个算法的时间复杂度是O(nlgn)。

方法二:仍然是首先排序,然后我们用x减去S中的每一个元素,产生的数列存放于数组B,原来S中的n歌数存放于数组A。因为A是有序的,那么易知B的单调性与A的相反。然后我们使用归并排序中的merge中使用的排序两个已经排序的数列的方法进行合并。如果有重复元素即为查找成功。

PS:我感觉既然是集合,那么元素必然满足互异性,不知道{1,2,4}这个集合中是不是要排除2+2=4这种,不过我感觉使用上述两种方法都要进行结果的筛选。

时间: 2024-08-26 15:13:28

两数之和等于x的相关文章

给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true, 3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false. 论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x: 所以A[i]前面的数(不包括A[i])无论取哪两个数都

两数之和等于目标值

1. LeetCode(twoCode) Given an array of integers, find two numbers such that they add upto a specific target number. The function twoSum should return indices of the two numbers suchthat they add up to the target, where index1 must be less than index2

给定一个数组,求两数之和等于某个值

public static void main(String[] args) { int[] intArr = {1, 3, 5, 8, 9, 12}; int sum = 10; int right = intArr.length - 1; for (int i=0; i < intArr.length; ) { if (right == i) { throw new IllegalArgumentException("未获取到有效取和值"); } if (sum == int

167. Two Sum II - Input array is sorted两数之和

1. 原始题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值(index1 和 index2)不是从零开始的. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素. 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 .因此 in

leetcode T1 两数之和详解

两数之和 题目描述 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例 给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1] 详细题解 暴力枚举 暴力法的思路很简单:遍历数组nums的每一个元素nums[i],在[i+1, ...,

LeetCode刷题8——两数之和

一.要求 二.背景 数组: 数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按有序的形式组织起来的一种形式.抽象地讲,数组即是有限个类型相同的元素的有序序列.若将此序列命名,那么这个名称即为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素.而用于区分数组的各个元素的数字编号则被称为下标,若为此定义一个变量,即为下标变量 三.思路 (1)挨个找两数之和等于目标值,并找对应两个数的索引,当两个数相等的时候 修改代码后运行成功 (2)进阶版:如果是三个数之和呢 原文地址:https

leetcode_01两数之和

题目描述给定一个整型数组,要求返回两个数的下标,使得两数之和等于给定的目标值,要求同一个下标不能使用两次.数据保证有且仅有一组解. 样例 给定数组 nums = [2, 7, 11, 15],以及目标值 target = 9, 由于 nums[0] + nums[1] = 2 + 7 = 9, 所以 return [0, 1]. 思路一 暴力破解 代码 #include <iostream> using namespace std; class Solution { public: int*

【算法C++】检测数组里是否有两个数之和等于某个数

问题: 检测数组里是否有两个数之和等于某个数 解决方法一:先将数组排序,然后从两头开始遍历 数组排序后,从左端开始取最小值,从右端取最大值, 判断两者之和与目标的大小: 1. 等于时,输出两个数: 2. 大于时,右端移到第2个数,继续判断: 3. 小于时,左端移到第2个数,继续判断. #include <iostream> #include <string> #include <algorithm> using namespace std; void fun1(int

LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

Given an array of integers that is already sorted in ascending order, 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 m