一个非常简单的算法题是否愿意挑战一下呢
2016-03-10 22:37
260 查看
求两个数之和。这个问题够简单吧!能做对绝对不是问题,问题是你是否能做的比较好。好了,请看题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution. Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
看了题目之后,心中是否已经有了答案。很简单蛮力法嘛,一个双循环就可以搞定了。但是有没有更好一点的方法呢? 如果你已经想到了也没必要往下看了。
如果你还没有什么头绪,那么稍微往HashTable想想,估计你们也想到了。其实也是很简单,只是有时候想问题的方向不对,就老是想不到点子上罢了。如果还没想到的话,就往下看一下吧!
相比较于,用一个双循环,在时间效率上面可能不是很好。那么久可以很容易想到,也经常听到的“空间换时间”,就是这样,我们可以使用一个字典键值对保存中间值,减少一次循环,变成单循环,那么时间效率就可以得以提升。 那么这个字典到底保存什么呢?保存目标值减去当前数组的整数值(键)和数组整数值的下标(值)。当我们执行循环时,每循环到一个数组中的整数,我们就判断这个整数是否是字典中的键,如果不是我们就按照前面说的键值存入字典中,题目说了有且只有一对数字是符合条件的,那么也就不用考虑重复键了。如果是,我们就找到了这两个整数,接着就是返回整两个整数的下标了。第一个整数的下标就是当前字典的键对应的值,第二个整数的下标就是当前循环到的i值。就是这么简单!如果我说的不够清楚就直接看代码。
以下是C#的实现:
using System; using System.Collections.Generic; namespace XiaoLiang { public class TwoSum { public int[] TwoSum(int[] nums, int target) { int[] result = new int[2]; Dictionary<int, int> dictionary = new Dictionary<int, int>(); for (int i = 0; i < nums.Length; i ++ ) { if(dictionary.ContainsKey(nums[i])) { result[0] = dictionary[nums[i]]; result[1] = i; return result; } else { dictionary.Add(target - nums[i] , i); } } return result; } }
以下是C++的实现:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i = 0, n = nums.size(); unordered_map<int, int> m; vector<int> ret; for (i = 0; i < n; ++i) { if (m.find(target - nums[i]) != m.end()) { ret.push_back(m[target - nums[i]]); ret.push_back(i); break; } m[nums[i]] = i; } return ret; } };
如果有什么说的不对的地方欢迎拍砖,有更好的方法可以共享。
相关文章推荐
- 计算机研究生笔试+面试准备
- 第2周项目3-小试循环
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- LEETCODE 169
- 与元素大小相关的属性
- ESP8266 SDK 编程入门 03-程序篇
- Linux文本处理三剑客之grep一族与正则表达式
- 3月9日
- Java IO详解(转)
- 找工作——数据结构
- MVC后台数据赋值给前端JS对象
- Kernel 开始学linux运维的基本概念总会
- 猜拳游戏案例
- Caffe for Windows 训练cifar10 VS2013
- 猜拳游戏案例
- 表单提交servlet的两种解决乱码方式
- 猜拳游戏案例
- #include<>和#include“” 区别
- iOS的socket开发基础
- KL26---GPIO 复用