LeetCode | 1.两数之和
这次来写一下 LeetCode 的第 1 题,两数之和。
题目描述
题目直接从 LeetCode 上截图过来,题目如下:
上面的题就是 两数之和 题目的截图,同时 LeetCode 会根据选择的语言给出了一个类的定义或者函数的定义,然后在其中实现 两数之和 的解题过程。这次我分别使用 C 语言和 C++ 语言来进行完成。
C ++ 给出的类定义如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
}
};
C++ 类中的 twoSum 成员函数有两个参数,分别是 nums 和 target,这两个参数和题目中描述的是一样的。
C 语言给出的函数定义如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
}
C 语言给出的 twoSum 函数有四个参数,nums 和 target 和 C++ 是相同的,numsSize 表示数组 nums 的元素个数,而 returnSize 表示返回元素的个数。
问题分析
本题最简单的解法就是使用 双重循环 来找满足条件的两个数即可,即在 nums 中找出两个数进行相加,相加的和等于 target。这个是最直观的解题方法。这个方法我打算使用 C 语言去进行实现。
除了使用双重循环来找满足条件的两个数以外,还可以通过一个循环来完成。一个循环想要完成,就要建立一个 map 来记录已经遍历过的数据,map 的 key 为 nums 中的值,map 的 value 为 nums 的下标。比如,题目中的 [2, 7, 11, 15] 数组,然后记录到 map 中为 map[2] = 0,map[7] = 1 这样的形式,2 是 nums 中的值, 0 是 数值 2 的下标。然后循环使用 target 去减 nums[i], 使用所得的结果,在 map 中进行 key 的查找,如果找到,直接返回当前的 nums 的下标 i,和在 map 中找到的 key 的 value 即可。以题目中的示例举例,target 为 9,当前 nums[1] = 7,9 - 7 的结果为 2,然后使用 2 做为 key 在 map 中查找,找到 map[2] 为 0,则将 0 (0 是 map[2] 的 value) 和 1 (1 是 nums[1] 的下标) 返回即可。
代码实现
C 语言的代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i, j;
int *pArr = NULL;
for (i = 0; i < numsSize - 1; i ++) {
for (j = i + 1; j < numsSize; j ++ ) {
if (nums[i] + nums[j] == target) {
pArr = (int*)malloc(2 * sizeof(int));
pArr[0] = i;
pArr[1] = j;
*returnSize = 2;
return pArr;
}
}
}
return pArr;
}
C++ 的代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> mapNums;
vector<int> arr;
int size = nums.size();
for(int i = 0; i < size; i ++)
{
map<int, int>::iterator iter = mapNums.find(target - nums[i]);
if (iter != mapNums.end())
{
arr.push_back(iter->second);
arr.push_back(i);
return arr;
}
mapNums[nums[i]] = i;
}
return arr;
}
};
提交结果
在写完代码后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们可以根据给出的测试用例来继续修改代码。我们分别提交一次 C 语言的代码,然后再提交一次 C ++ 的代码,然后观察其输出的结果,以上两段代码 “提交” 以后的截图如下:
C 语言提交的结果如下:
C ++ 提交的结果如下:
观察两个程序的输出结果,使用 C 语言的执行时间要比使用 C++ 的执行时间长一些,因为在 C 语言中使用了两重循环,它的时间复杂度为 O(n^2),而在 C++ 中只使用了单个循环,它的时间复杂度为 O(n)。而 C++ 代码的内存消耗比 C 语言的内存消耗要大,因为我们使用 map 来记录了 nums 中的值,它的空间复杂度为 O(n)。这就是典型的通过 空间换时间 和 时间换空间 的情况。
- 使用 JavaScriptService 在.NET Core 里实现DES加密算法
- 拒绝全英文垃圾评论!仅用代码实现
- 在.NET Core 里使用 BouncyCastle 的DES加密算法
- 微信小程序:为了满足三方需求,我们一直在改变
- 让陌生人能够相互自由交易和支付
- 斯坦福发布首份 AI Index 报告,AI 研究者不再茫然
- jQuery仿极客公园火箭发射“返回顶部”效果(初始篇)
- Java程序员必读,Java设计模式应该遵循哪些原则
- Visual Studio 2010快速参考指南里头的Scrum海报
- TFS2010 Team Project Collections
- 基于Ext.Panel扩展一个更容易操作的Canvas
- 好玩的效果很好的Html游戏和范例
- jQuery仿极客公园火箭发射“返回顶部”效果(优化篇)
- 北京市首个无人驾驶试运营基地落户顺义
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 动图演示:手撸堆栈的两种实现方法!
- [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市
- leetcode1552题解【二分+贪心】
- 这三年被分布式坑惨了,曝光十大坑
- 为什么删数据也提示空间不足呢?
- 前端踩坑系列《六》——让人又爱又恨的npm包
- docker运行Tomcat后访问首页报404(详细永久解决步骤)
- vue.js如何快速入门第1篇
- 3.列表-HTML基础
- 启动时间的一些分析
- 1.HTML基础知识-HTML进阶
- 浅析一个postgresql的死锁问题
- 你的第一个React App (二 ) - 应用组件开发
- 在Angular应用里使用Redux
- Elasticsearch 日志配置详解