Coding:在数组中查找具有给定总和的对
PS:没事儿做做题,预防老年痴呆~
描述
给定一个未排序的整数数组,找到其中有给定总和的一对数字。
eg:
输入:
arr = [3,5,2,9,7,6,11,0]
sum = 10
输出:
索引 0和4
只要找到一对数字即可。
方法一
最简单也是最暴力的方法,用两个循环遍历数组,判断两个数字之和,如果符合条件则返回数组下标。该方法比较简单,但是时间复杂度为O(n^2),比较高。
直接上代码,C++实现
// 时间复杂度O(n^2) 空间复杂度 O(1)
vector<int> findPair1(const vector<int> &arr,int sum)
{for(int i = 0 ; i < arr.size()-1 ; ++i){for(int j = i + 1 ; j < arr.size() ; ++j){if(arr[i] + arr[j] == sum){return {i,j};}}}return {};
}int main()
{vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair1(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0;
}
方法二
第二种方法借用排序来实现,首先对数据进行排序,然后定义两个索引变量分别指向数组的头和尾,将索引头和尾的元素总和与期望值进行比较,如果小于期望值,则把低位索引加1,如果大于期望值,则把高位索引减1,通过循环直到低索引比高索引大,则返回。该方法时间复杂度为O(n*logn)。
上代码
// 时间复杂度O(nlogn) 空间复杂度 O(1)
vector<int> findPair2(vector<int> &arr,int sum)
{std::sort(arr.begin(),arr.end());int low = 0;int high = arr.size() - 1;while(low < high){if(arr[low] + arr[high] == sum){return {low,high};}(arr[low] + arr[high] > sum) ? high--:low++;}return {};
}int main()
{vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair2(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0;
}
方法三
第三种方法,可以借用map来解决,将数组的元素值和索引对应存储在map中,通过检查 sum-arr[i] 是否存在于map来确定想要的值。刚方法效率最高,只需要通过一次循环即可完成,所以时间复杂度为O (n).
上代码:
// 时间复杂度O(n) 空间复杂度 O(n)
vector<int> findPair3(vector<int> &arr,int sum)
{std::map<int,int> tempMap;for(int i = 0 ; i < arr.size()-1 ; ++i){if(tempMap.find(sum - arr[i]) != tempMap.end()){return {tempMap[sum - arr[i]],i};}tempMap[arr[i]] = i;}return {};
}int main()
{vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair3(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0;
}
该题比较简单,主要考虑在不同的情况下其时间和空间复杂度的区别。闲来无事,就当练练手吧,保持思维的运转,哈哈哈~
Coding:在数组中查找具有给定总和的对相关推荐
- 在有空字符串的有序字符串数组中查找(找给定字符串)
题目:在有空字符串的有序字符串数组中查找 有个排序后的字符串数组,其中散布一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引. package zifusearch;public c ...
- 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标
34. 在排序数组中查找元素的第一个和最后一个位置 难度中等2012 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target.请你找出给定目标值在数组中的开始位置和结束位置. 如果 ...
- 二分法查找是基于有序_利用二分法查找有序数组中是否含有给定Value
//利用二分法查找有序数组中是否含有给定Value class AlgorithmByZXQ { /// /// 二分法查找数组中某一数值 /// /// /// /// /// /// public ...
- 算法----- 在排序数组中查找元素的第一个和最后一个位置
题目: 在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log ...
- python 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.如果数组中不存在目标值 target,返回 ...
- 6、leetcode34 在排序数组中查找元素的第一个位置和最后一个位置**
leetcode34 在排序数组中查找元素的第一个位置和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存 ...
- 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...
- 在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居
在数组中查找第k个最大元素 Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) g ...
- 力扣——在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返 ...
最新文章
- Linux同步自己的配置,Linux学习心得之——Rsync同步配置
- 用数学方法构造神经网路的迭代次数1-9
- [并发编程] - 操作系统底层工作原理
- kafka生产者和消费者端的数据不一致
- Postman从入门到入门
- python 抽奖器_兄弟连学python (02) ----简易抽奖器
- 高一计算机应用选择题,职业中学 高一《计算机应用基础》期末考试题
- 史上最拉风年货?苏宁门店私人飞机开售 网友:这个真香不了吧
- SqlServer中使用游标遍历数据集合
- 三成手机电子书暗藏陷阱 诱骗下载强行吸费
- k8s:worke节点启动后,node处于NotReady状态
- java校验中文姓名合法性(需要支持生僻字与分隔符·)
- adobe acrobat pro 9.0 总是弹出许可证问题解决方案
- 如何在Hyper-V、Virtual PC等虚拟机中使用USB设备
- python培训千锋和黑马哪个好
- 开机启动计算机时 屏幕无显示桌面,开机时电脑黑屏没有出现桌面怎么处理
- springcloud五大神兽之Feign
- JAVA代码怎样变成软件_怎么使JAVA程序变成可执行程序
- js文件上传,java后台接收
- 解决关于VMwareWorkstation下载以太网卡驱动不能用的问题