您的位置:首页 > 其它

leetcode Two Sum问题

2018-03-18 20:19 260 查看
Two Sum I

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;
}


一些思考

对比上述两个题目可以看出,需要解决的问题几乎一致,但是由于给定条件不一样,数组是否有序,导致解决问题的思路也不一样,一般来说,上述两种方法也是比较常见的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: