LeetCode的第一题能够说是开胃菜,它的难度还不至于吓退一个诚心要刷题的人,也能给新来的一点信心。就从它开始LeetCode之旅吧。java
题目:两数之和算法
描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素。数组
示例:学习
这个题目看起来并不复杂,咱们只须要在数组中找到两个数相加以后等于target的值便可。可能咱们许多人第一个想法就是双重for循环,也就是下面的解法一:暴力查找的方式。测试
用外层循环选定一个值,用内层循环判断它们的和是否等于target。示例代码以下:code
public int[] twoSum(int[] nums, int target) { int len = nums.length; for (int i = 0; i < len; i++) { for (int j = i + 1; j < len & j != i; j++) { if (nums[i] + nums[j] == target) { return new int[] { i, j }; } } } return null; }
这一解法很简单,也很符合咱们的思惟方式,可是它对于计算机来讲就不那么友好了。这个算法的时间复杂度为O(n<sup>2</sup>),虽然用它能够经过测试,可是在面对很大数组时就再也不适用,咱们应该考虑更高效的方式。blog
能够发现,促使咱们适用双重for循环的主要缘由在于咱们知道每一个数字的下标,可是不知道它们的值,数组自己就是根据下标获取值容易,而查找较难。若是咱们能把下标和值对应起来,就能够解决数组的这一问题,因此考虑使用哈希表。哈希表的特性偏偏能够解决数组查询慢的问题,因而有了如下代码:图片
public int[] twoSumOptimize(int[] nums, int target) { int len = nums.length; Map<Integer, Integer> map = new HashMap(len); for (int i = 0; i < len; i++) { map.put(nums[i], i); } for (int i = 0; i < len; i++) { int temp = target - nums[i]; if (map.containsKey(temp) && map.get(temp) != i) { return new int[] { i, map.get(temp) }; } } return null; }
由于要把数组转存成哈希表,因此空间复杂度增长到了O(n),但也由于哈希表的查询优点,时间复杂度下降到了O(n)。由于时间复杂度下降的幅度很大,因此这是值得的。资源
若是追求简练的代码,上述两次for循环还能够合并成一个,代码以下所示:get
public int[] twoSumOptimize(int[] nums, int target) { int len = nums.length; Map<Integer, Integer> map = new HashMap(len); for (int i = 0; i < len; i++) { int temp = target - nums[i]; if (map.containsKey(temp) && map.get(temp) != i) { return new int[] { map.get(temp), i }; } map.put(nums[i], i); } return null; }
这个简单的题目给咱们启示:符合咱们思惟的算法最容易想到,但对计算机不必定高效。而经过各类题目的锻炼能够加强咱们的计算机思惟,让计算机能更高效的为咱们服务。
题目:两数相加
描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,而且它们的每一个节点只能存储 一位 数字。若是咱们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您能够假设除了数字 0 以外,这两个数都不会以 0 开头。
示例:
相关源码请加QQ获取。
【感谢您能看完,若是可以帮到您,麻烦点个赞~】
更多经验技术欢迎前来共同窗习交流: 一点课堂-为梦想而奋斗的在线学习平台 http://www.yidiankt.com/
![关注公众号,回复“1”免费领取-【java核心知识点】]
QQ讨论群:616683098
QQ:3184402434
想要深刻学习的同窗们能够加我QQ一块儿学习讨论~还有全套资源分享,经验探讨,等你哦!