leetcode Two Sum问题
2018-03-18 20:19
260 查看
Two Sum I
Two Sum II - Input array is sorted
给定一个整数数组,返回这两个数字的索引,使它们合计成一个特定的目标。
限定条件:
返回值为这两个数字的索引,索引从0开始
假定每个输入都只有一个解,且不能使用相同的元素两次
给定已按升序排序的整数数组,找到两个数字,使它们合计为特定的目标数字。
限定条件
返回值为这两个数字的索引,且该索引是从1开始
假定每个输入都只有一个解,且不能使用相同的元素两次
Two Sum II - Input array is sorted
第1题 Two Sum I
题目要求:给定一个整数数组,返回这两个数字的索引,使它们合计成一个特定的目标。
限定条件:
返回值为这两个数字的索引,索引从0开始
假定每个输入都只有一个解,且不能使用相同的元素两次
解决思路
由于数组有序,故采用对撞指针的方法。设置两个指针分别指向数组的头尾,当两个数的和大于给定的值时,右指针左移,小于时,左指针右移。这里需要注意的时,左指针必须小于右指针。Java代码
public int[] twoSum(int[] nums, int target) { int [] res = new int[2]; HashMap<Integer,Integer> tm = new HashMap<>(); for(int i =0;i<nums.length;i++){ if(tm.containsKey(target - nums[i])){ res[0]=tm.get(target-nums[i]); res[1]=i; }else{ tm.put(nums[i],i); } } return res; }
第167题Two Sum II
题目要求:给定已按升序排序的整数数组,找到两个数字,使它们合计为特定的目标数字。
限定条件
返回值为这两个数字的索引,且该索引是从1开始
假定每个输入都只有一个解,且不能使用相同的元素两次
解决思路
由于数组可能无序,且要返回的是元素的索引。所以我想到的办法是利用Set集合建立一个查找表,遍历整个数组,每次放入一个新元素时,在表中查找是否有target - nums[i],如果存在则返回相应的索引,反之则继续遍历。Java代码
public int[] twoSum(int[] numbers, int target) { int[] arr = new int[2]; int l = 0,r = numbers.length-1; while(l<r){ if(numbers[l]+numbers[r]>target) r--; else if(numbers[l]+numbers[r]<target) l++; else{ arr[0] = l+1; arr[1] = r+1; break; } } return arr; }
一些思考
对比上述两个题目可以看出,需要解决的问题几乎一致,但是由于给定条件不一样,数组是否有序,导致解决问题的思路也不一样,一般来说,上述两种方法也是比较常见的。相关文章推荐
- [c++] LeetCode Two Sum问题
- LeetCode算法问题9 —— Two Sum
- LeetCode-two sum:python解答数组问题
- LeetCode-问题1-Two Sum
- 【LeetCode解题一】Two Sum问题Java解答
- LeetCode - Two Sum
- LeetCode题目:1. Two Sum
- [LeetCode]Two Sum
- leetcode001:Two Sum
- 【leetcode】整型翻转问题integer reverse
- Leetcode之Remove Nth Node From End of List 问题
- leetcode第一题two sum
- leetcode01 Two Sum 寻找列表中和为定值的元素位置
- [LeetCode] 1 Two Sum
- LeetCode问题 pow(x,n)
- LeetCode : Two Sum
- leetcode Course Schedule系列问题,拓补排序,有向无环图
- Leetcode之Maximum Product of Three Numbers 问题
- leetcode之Game of Life 问题
- leetcode 1 two sum