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.两数之和相关推荐

  1. [leetcode]1.两数之和

    [leetcode]1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应 ...

  2. [hashmap|空间换时间] leetcode 1 两数之和

    [hashmap|空间换时间] leetcode 1 两数之和 1.题目 题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下 ...

  3. C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组

    C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...

  4. LeetCode 1. 两数之和

    LeetCode 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入 ...

  5. 【前端来刷LeetCode】两数之和与两数相加

    大部分玩前端的小伙伴,在算法上都相对要薄弱些,毕竟调样式.调兼容就够掉头发的了,哪还有多余的头发再去折腾. 确实在前端中需要使用到算法的地方是比较少,但若要往高级方向发展,算法的基本功就非常重要啦.对 ...

  6. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  7. 力扣(leetcode)-1. 两数之和

    描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...

  8. LeetCode 01两数之和02两数相加

    力扣 LeetCode01两数之和 LeetCode02两数之加 前言:第一次LeetCode打卡题解,前面组织的打卡活动从今天开始正式开始了,很多csdn和公众号小伙伴以及加入了,欢迎加入!详细看力 ...

  9. Leetcode 1. 两数之和 (Python版)

    有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...

  10. 【LeetCode】两数之和

    package leetcode.editor.cn;//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. // // 你可 ...

最新文章

  1. 运算符 - PHP手册笔记
  2. JACK——PaintRobot Exercise9
  3. 花30分钟,用Jenkins部署码云上的SpringBoot项目
  4. plugin since you are using Gradle version 4.6 or above
  5. leetcode 100.Same Tree
  6. 关于this和base
  7. 【Flink】SqlValidatorException: Column xxx not found in any table
  8. mysql数据库第五章_第五章 数据库的查询
  9. 如何用计算机制作统计图,统计图制作_ai的环形统计图怎么制作
  10. 软考信息系统项目管理师真题及答案之案例分析
  11. 面向对象:兜兜转转了很久,希望你恰好也在
  12. 【线性代数】1.2矩阵的行列式与克莱姆法则
  13. Java使用IKAnalyzer实现多关键字查询
  14. 机器视觉之缺陷检测的光源
  15. vscode中检查单词是否拼写错误的插件
  16. 个人博客作业Week3
  17. 关于电脑鼠标不受控乱动的问题
  18. 多用户商城系统 KgMall2.1发布
  19. javascript小技巧[转]
  20. Linux初级工程师应知应会

热门文章

  1. 节能原理 (能量平衡)
  2. 微软提出AdaLM,用于开发小型、快速且有效的领域预训练语言模型
  3. 聚焦视频文本检索:一文概览视频文本检索任务最新研究进展
  4. 中文数据集有奖公开征集
  5. 如何用最简单的方式理解傅立叶变换?
  6. 三分熟博士生の阅读理解与问答数据集 | 论文集精选 #03
  7. java中除金额_《java中把金额以3位分开的计数法》
  8. RabbitMQ之呕心沥血的总结(图文并茂、万字级别、毕生所学)
  9. 云原生系列「0」容器概述
  10. jfinal使用render之后还会继续往下执行代码吗