1.Two Sum
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].
解题实录:
方法一:哈希表。将每个数字放在map中,历遍数组,如果出现和数组中的某一个值相加为target的时候,break。
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[]res = new int[2];
if(nums==null||nums.length<2)
return null;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
res[0] = map.get(target-nums[i]);
res[1] = i;
}
map.put(nums[i],i);
}
return res;
}
}
方法二:先对数组进行排序,然后使用夹逼的方法找出满足条件的pair,原理是因为数组是有序的,那么假设当前结果比target大,那么左端序号右移只会使两个数的和更大,反之亦然。所以每次只会有一个选择,从而实现线性就可以求出结果。该算法的时间复杂度是O(nlogn+n)=O(nlogn),空间复杂度取决于排序算法。
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[]res = new int[2];
if(nums==null||nums.length<2)
return null;
Arrays.sort(nums);
int f = 0;
int l = nums.length - 1;
while(f<l){
if(nums[f] + nums[l] == target){
res[0] = f;
res[1] = l;
return res;
}else if(nums[f] + nums[l] > target){
l--;
}else{
f++;
}
}
return null;
}
}
方法二存在的问题是nums的经过排序后内部的数字顺序已经改变,下标也改变了。