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

首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题。对于类似的这样的查找操作的具体办法就是三种解决方法:

1.暴力算法,多个for循环,很高的时间复杂度
2.先排序,然后左右夹逼,但是这样会破坏原始数组的下表
3.利用Hash表,直接定位元素,很少的时间复杂度

  

TwoSums

先来看看最简单的,在一个数组中找两个数的和等于某个数。

这个题目最简简单的方法就是暴力法,所需的时间复杂度是O(n2),但是这是不允许的,所以一个O(n)的方法就是利用Hash表存储数据,这样能够把查找的时间降低下来。使用到的工具就是unordered_map。在这个hash表中,key是数组的数字本身,value是数组数字的下标值。这样只需要把原数组扫描一遍,对于每一个数组中的值,求target与数组元素的差值,然后把这个差值作为key到hash表中找对应的value。

但是注意这样的值:

3   2   4  target=6

这样会产生三组值满足:(3,3)(2,4)(4,2)所以要规定一下:第二个通过hash得到的下标值一定要比第一个下标值大才可以。

vector<int> twoSum(vector<int>& nums, int target)
{
	unordered_map<int, int> mapping;
	vector<int> result;

	for(int i = 0; i < nums.size(); i++)
	{
		mapping[nums[i]] = i;
	}

	for(int i = 0; i < nums.size(); i++)
	{
		const int gap = target - nums[i];

		if(mapping.find(gap) != mapping.end() && mapping[gap] > i)
		{
			result.push_back(i + 1);
			result.push_back(mapping[gap] + 1);
		}
	}

	return result;
}

  find函数,在找到的时候会返回一个指向该元素的iterator,如果没有找到会返回一个end。如果找到了,可以通过operator[]来访问这个元素。

时间: 2024-08-08 05:43:49

在数组中找几个数的和等于某个数[LeetCode]的相关文章

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

一个数组中找到满足和为sum的两个数

如果考虑hashmap直接O(n)的速度, 如果不行,就先排序,两头指针很好推理,关键是 a[beg] +a[end]>sum,意思就是说a[end]太大了,最小的数的都不满足,所以排除a[end] 绝知此事要躬行 #include<iostream>#include<algorithm>using namespace std; bool find(int *a,int sum,int len,int &ans1,int &ans2){    int *beg

有序数组中找中位数

问题描述 给定两个有序数组,返回这两个数组的中位数.如果中位数有两个,则返回它们的平均值. e.g. [1, 3, 5]和[2, 4, 6]的中位数是3.5 解决思路 如果两个数组的长度之和为奇数,则中位数有一个:否则中位数为其中两个的平均值. 从两个数组中找第k个数,可以使用递归的思路. 程序 首先,写出在有序数组a和b中找到第k大的程序: 1. 利用归并排序中的merge数组方法,时间复杂度为O(k). public int findKthNaive(int[] a, int[] b, in

脑洞题目 - 改自从一组无序数组中找不存在的最小正整数

无聊想的题目,但题目创意改自从一组无序数组中找不存在的最小正整数.并不难,但也有陷阱,比考虑0和负数... /** * 从无序数组中找不存在的最小正整数 * 我的要求:比如:{3,4,6,9,20}中 最小的不存在的正整数为2 */ #include <stdio.h> int main() { int arr[] = {-5, -10, 42, 29, 18, -3, 8, 20, -1}; int i, j, temp; for(i = 1; i < sizeof(arr)/size

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j

C语言:对传入sp的字符进行统计,三组两个相连字母“ea”&quot;ou&quot;&quot;iu&quot;出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 #pragma warning (disable:4996) 4 void fun(char*sp ,int *ct) 5 { 6 int a=0, b=0, c=0; 7 while (*sp != '\0') 8 { 9 if (*s

在递增数组中找一个数字

让人瑟瑟发抖的面试题... 来我们看一下题目在一个二维数组中,每一行都按照从左到右递增的顺序操作.每一列都按照从上到下递增的顺序排序.完成代码,输入这样一个二维数组和一个整数,判断数组是否含有该整数 怎么解决勒???分析:如果二维数组是这样,为了解决问题完全可以把数组遍历一遍,但是为了效率,我们需要把时间复杂度降低,为了遍历最少的数字,我们需要把行和列分开.所以,我们会从数组中找一个数字进行判断,然而,随便找一个数字,只会让问题变的跟复杂,比如,找一个10,左边和上边都比10小,而下边和右边都比

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

笔试题--在一个整数数组中找出第5大的数

/** * 在一个整数数组中找出第5大的数 * 思路是首先在数组中找到最小数,然后依次找到第五大的数 * * @param array * @return */ public static int[] selectionSort(int[] array) { if (array.length == 0) return array; for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i; j < arr