标签:
朋友介绍了leetcode 这个oj网站,包含了很多程序员的试题,我去看了下,对提高算法能力很有针对性,我决定尝试开始解题历程,并和大家分享我的解题,这是第一题:
1: 给定一个int数组,和 一个 int target 值,数组中有两个值的和为target ,给出这两个值的下标,你可以认为解只有一个。
水题,以下是我的代码:
public class Solution { public int[] twoSum(int[] nums, int target) { int i=0,j = 0 ; for (i = 0; i < nums.length; i++) { for (j = i + 1; j < nums.length; j++) { if((nums[i]+nums[j]) == target) return new int[]{i,j} ; } } return null; } }
O(n*n) ,这解法一般,第一次写没有想这么多,其实可以有优化的空间,看了答案可以用map解,效率提高,而且如果找不到应该抛出异常,我试着实现后如下:
class Solution2 { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<Integer,Integer>() ; map.put(nums[0], 0) ; for(int i=1; i<nums.length;i++){ int num1= target-nums[i] ; if(map.containsKey(num1)){ int index1 = map.get(num1); return new int[]{index1,i}; } else map.put(nums[i], i) ; } throw new IllegalArgumentException("No solution"); } }
用map 存 第一个 数, key 存 数组中的值 ,value 存 值的下标。
遍历后面的元素, 假定当前元素是num ,如果它是解 ,另一个解应该 是前面map 已经存起来的 key值,
即 map 包含 一个 key 满足: key + num = target ,满足了,则为解,可以通过map 求出 key值的下标,
当前遍历数组可得知num的下标,得出结果。暂时不满足,则<num,i> 存到map 中。挺巧妙的。
标签:
原文地址:http://www.cnblogs.com/coderbill/p/TwoSum.html