leetcode之数组中找两数和为指定值

题目:

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 your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2

思路:

最直接的思路当然是两两尝试,但是这样的时间复杂度为O(n2),这样的时间复杂度不到万不得已还是不要接受,再尝试思考,如果能用target减去数组中的一个数然后得到结果再到数组中搜寻,如果能找到即可,这样的话无疑就需要一个能搜索的数据结构了,想到map,先遍历一遍简历搜索库,然后再按照以上思路进行,这样的时间复杂度为O(n),代价是以空间换时间,这样是不是最优解呢?以后再慢慢思考吧,反正我的这段代码是通过了leetcode OJ的。

代码:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        std::map<int, int> finder;
		for (int i = 0; i<numbers.size(); i++)
		{
			int val = numbers.at(i);
			finder.insert(std::pair<int, int>(val, i));
		}
		for (int i = 0; i<numbers.size(); i++)
		{
			int left = target - numbers.at(i);
			if (finder.find(left) == finder.end())//not found
			{
				continue;
			}
			else
			{
				std::vector<int> re;
				if(finder[left]==i)
				{
				    continue;
				}
				else if (finder[left]<i)
				{
					re.push_back(finder[left]+1);
					re.push_back(i+1);
				}
				else
				{
					re.push_back(i+1);
					re.push_back(finder[left]+1);
				}
				return re;
			}
		}

    }
};
时间: 2024-10-23 23:56:05

leetcode之数组中找两数和为指定值的相关文章

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素

bestcoder#43 1002 在数组中找两个数的和取模的最大值 二分

bestcoder#43 1002 在数组中找两个数的和取模的最大值  二分 pog loves szh II Accepts: 97 Submissions: 834 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description Pog and Szh are playing games. There is a sequence with n number

第14题:查找升序数组中的两数,使其和为输入数字

欢迎转载,转载请注明出处:http://blog.csdn.net/alading2009/article/details/45080773 第14题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求: 时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可.例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 两头向中间靠拢,因为是升序数组,两数之和大了就尾指针前移,两数之和小了就头指针后

Leetcode 532.数组中的K-diff数对

数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k. 示例 1: 输入: [3, 1, 4, 1, 5], k = 2 输出: 2 解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5). 尽管数组中有两个1,但我们只应返回不同的数对的数量. 示例 2: 输入:[1, 2, 3, 4, 5], k =

在数组中找几个数的和等于某个数[LeetCode]

首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会破坏原始数组的下表 3.利用Hash表,直接定位元素,很少的时间复杂度 TwoSums 先来看看最简单的,在一个数组中找两个数的和等于某个数. 这个题目最简简单的方法就是暴力法,所需的时间复杂度是O(n2),但是这是不允许的,所以一个O(n)的方法就是利用Hash表存储数据,这样能够把查找的时间降低

int类型数组中找出现几次的数的题目总结

1.     题目1:int类型数组中除了一个数出现一次以外,其他数都出现两次,求该数. [分析]全部异或运算即可. 2.     题目2:int类型数组中除了两个数出现一次以外,其他数都出现两次,求这两个数. 参考:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ [分析]:全部亦或之后得到的数为resultExclusiveOR,找到它的第一个不是0的位,然后将数组按这个位是否为0分成两组,组内全部亦或即可. /

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

在数组中找出只出现一次的两个数

来来来,看一道面试题!!! 题目是这样叙述的: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字. 要求:时间复杂度为O(N),空间复杂度为O(1). 这该怎么解决呢??? 请看我的分析: 将这道题简单化: 一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A:我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字. 如果这个数组中出现两个不同的数字,而其他数字均

javascript 找出数字数组中最大的数

找出数字数组中最大的数 var Match = (function(){ var arr = null; var len = 0; return { max:function(arr,len){ arr = arr; len = arr.length; var newArr = arr.sort(); return newArr[len-1]; } } })(); var maxCount = Match.max([3,4,5,11,3,4,55,67,88,33]); console.log(