- 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;
}
一些思考
对比上述两个题目可以看出,需要解决的问题几乎一致,但是由于给定条件不一样,数组是否有序,导致解决问题的思路也不一样,一般来说,上述两种方法也是比较常见的。