LeetCode 1: Two Sum
2016-05-05 10:12
519 查看
题目:
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:
题目分析:
给定一个整形的数组,返回数组中两个元素的下标,这两个数的和为给定的值。假设对于每个确定的输入值都只有一种解。
思路:
这个题在LeetCode OJ上给出了三种解决方案:Brute force(简单匹配算法)、Two-pass hash table、 One-pass hash table。后两种笔者不知道怎么翻译了……有时候翻译成中文倒是没有英文那么直观。
对于第一种Brute force,网上有说成是暴力算法的,主要就是遍历,时间复杂度高是O(n^2),空间复杂度是O(1)直接上代码:
Two-pass hash table:最主要的思路来源一个问题“对于一个数组来说,维护其字面值和索引的最好的方式是什么?是哈希表。”首先将所有元素存储到哈希表中,遍历nums中的元素,每遍历一个元素时使用target-遍历元素,得到的结果再去哈希表中找,寻找的时间复杂度接近O(1),这样,我们只需要遍历一遍就能找到结果。整个算法的时间复杂度是O(n),空间复杂度是O(n)。算法的核心就是时空转换嘛,上代码:
One-pass hash table:我个人觉得这个算法棒极了,和第二种算法的区别在于思路!思路!思路!重要的事情说三遍!在建立哈希表的同时就可以一边看当前哈希表中是否有符合条件的值,如果有,哈希表还没建完就找到了答案,岂不妙哉?虽然时间复杂度和空间复杂度同第二种算法~,话不多说上代码:
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].
题目分析:
给定一个整形的数组,返回数组中两个元素的下标,这两个数的和为给定的值。假设对于每个确定的输入值都只有一种解。
思路:
这个题在LeetCode OJ上给出了三种解决方案:Brute force(简单匹配算法)、Two-pass hash table、 One-pass hash table。后两种笔者不知道怎么翻译了……有时候翻译成中文倒是没有英文那么直观。
对于第一种Brute force,网上有说成是暴力算法的,主要就是遍历,时间复杂度高是O(n^2),空间复杂度是O(1)直接上代码:
public class Solution { public int[] twoSum(int[] nums, int target) { int result[] = new int[2]; int i; int j; for(i=0;i<nums.length-1;i++) { for(j=i+1;j<nums.length;j++) if (nums[i] + nums[j] == target) { result[0] = i; result[1] = j; return result; } } return null; } }
Two-pass hash table:最主要的思路来源一个问题“对于一个数组来说,维护其字面值和索引的最好的方式是什么?是哈希表。”首先将所有元素存储到哈希表中,遍历nums中的元素,每遍历一个元素时使用target-遍历元素,得到的结果再去哈希表中找,寻找的时间复杂度接近O(1),这样,我们只需要遍历一遍就能找到结果。整个算法的时间复杂度是O(n),空间复杂度是O(n)。算法的核心就是时空转换嘛,上代码:
public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i=0;i<nums.length;i++) { map.put(nums[i],i); } for(int i=0;i<nums.length-1;i++) { int complement = target - nums[i]; if(map.containsKey(complement)&&map.get(complement)!=i) { return new int[] {i,map.get(complement)}; } } return null; } }
One-pass hash table:我个人觉得这个算法棒极了,和第二种算法的区别在于思路!思路!思路!重要的事情说三遍!在建立哈希表的同时就可以一边看当前哈希表中是否有符合条件的值,如果有,哈希表还没建完就找到了答案,岂不妙哉?虽然时间复杂度和空间复杂度同第二种算法~,话不多说上代码:
public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i=0;i<nums.length;i++) { int complement = target - nums[i]; if(map.containsKey(complement)&&map.get(complement)!=i) { return new int[] {i,map.get(complement)}; } map.put(nums[i],i); } return null; } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树