【LeetCode】1.两数之和
1.两数之和
一、问题描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
二、问题简化
这个问题可以简化为:
“在一个数组中,寻找两个元素,可通过一个计算得到目标值”。
经过研究集合的定义,这里还是应该用数组描述比较恰当。数组是有序的、可重复的;多重集是无序的、可重复的;而集合是无序的、不可重复的。
元素可以不用是整数,用T表示。
计算不一定是求和,用fn表示。
答案可能不止一种,所以我们直接返回所有答案,而答案是一个二元组,所以最终返回的是二元组的数组,即:
vector<tuple<T, T>>
类型T的集合用代码表示为:
vector<T>
所以整个函数可以表示为:
template<typename T, typename F>
vector<tuple<T, T>> FindTwoToOne(const T& target, const vector<T>& vec, F fn);
三、功能实现
我通过遍历所有元素,当前元素与其后的所有元素做一次运算再比较目标值即可。这样完成了“每个元素与其他元素只且计算一次”。
template<typename T, typename F>
vector<tuple<T, T>> FindTwoToOne(const T& target, const vector<T>& vec, F fn)
{vector<tuple<T, T>> ret;//数组大小int size = vec.size();//小于2个元素,返回空结果if (size < 2)return ret;//遍历 (不包含最后一个元素)for (int i = 0; i != size - 1; ++i){//一直计算之后的所有元素for (int j = i + 1; j != size; ++j){if (fn(vec[i], vec[j]) == target)ret.push_back({ i, j });}}return ret;
}
四、测试结果
我用到了元组、模板、lambda表达式、auto,绝对是现代的C++写法。而网上的一般写法使用了哈希表,并且使用了加法计算的逆运算是减法这一特性,我的写法虽然没有降低复杂度,但更加普遍适用。
//1.两数之和#include <iostream>
#include <vector>
#include <tuple>
using namespace std;template<typename T, typename F>
vector<tuple<T, T>> FindTwoToOne(const T& target, const vector<T>& vec, F fn)
{vector<tuple<T, T>> ret;//数组大小int size = vec.size();//小于2个元素,返回空结果if (size < 2)return ret;//遍历 (不包含最后一个元素)for (int i = 0; i != size - 1; ++i){//一直计算之后的所有元素for (int j = i + 1; j != size; ++j){if (fn(vec[i], vec[j]) == target)ret.push_back({ i, j });}}return ret;
}int main()
{//目标值int target = 10;//源数组vector<int> vec = { 1,5,3,2,18,7,5,4,6,3,0,4,9,7,5,8,8,6,4,2 };//执行函数auto ret = FindTwoToOne(target, vec, [](int a, int b){return a + b;});//输出结果for (auto& iter : ret){cout << "[" << get<0>(iter) << ", " << get<1>(iter) << "]"<< " -> " << vec[get<0>(iter)] << " and " << vec[get<1>(iter)] << endl;}return 0;
}
【LeetCode】1.两数之和相关推荐
- [leetcode]1.两数之和
[leetcode]1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应 ...
- [hashmap|空间换时间] leetcode 1 两数之和
[hashmap|空间换时间] leetcode 1 两数之和 1.题目 题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下 ...
- C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组
C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...
- LeetCode 1. 两数之和
LeetCode 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入 ...
- 【前端来刷LeetCode】两数之和与两数相加
大部分玩前端的小伙伴,在算法上都相对要薄弱些,毕竟调样式.调兼容就够掉头发的了,哪还有多余的头发再去折腾. 确实在前端中需要使用到算法的地方是比较少,但若要往高级方向发展,算法的基本功就非常重要啦.对 ...
- leetCode:twoSum 两数之和 【JAVA实现】
LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...
- 力扣(leetcode)-1. 两数之和
描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...
- LeetCode 01两数之和02两数相加
力扣 LeetCode01两数之和 LeetCode02两数之加 前言:第一次LeetCode打卡题解,前面组织的打卡活动从今天开始正式开始了,很多csdn和公众号小伙伴以及加入了,欢迎加入!详细看力 ...
- Leetcode 1. 两数之和 (Python版)
有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...
- 【LeetCode】两数之和
package leetcode.editor.cn;//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. // // 你可 ...
最新文章
- 运算符 - PHP手册笔记
- JACK——PaintRobot Exercise9
- 花30分钟,用Jenkins部署码云上的SpringBoot项目
- plugin since you are using Gradle version 4.6 or above
- leetcode 100.Same Tree
- 关于this和base
- 【Flink】SqlValidatorException: Column xxx not found in any table
- mysql数据库第五章_第五章 数据库的查询
- 如何用计算机制作统计图,统计图制作_ai的环形统计图怎么制作
- 软考信息系统项目管理师真题及答案之案例分析
- 面向对象:兜兜转转了很久,希望你恰好也在
- 【线性代数】1.2矩阵的行列式与克莱姆法则
- Java使用IKAnalyzer实现多关键字查询
- 机器视觉之缺陷检测的光源
- vscode中检查单词是否拼写错误的插件
- 个人博客作业Week3
- 关于电脑鼠标不受控乱动的问题
- 多用户商城系统 KgMall2.1发布
- javascript小技巧[转]
- Linux初级工程师应知应会