TOW SUM解法汇总
解法一: 暴力法
双层for循环,简单粗暴。耗时29ms
这里有个小trick,就是i和j不能相等,要不然自身相加也会等于target;
class Solution {
public int[] twoSum(int[] nums, int target) {
// 如果是有序的数组的话,可以从两边向中间靠拢来缩小搜索范围
// 实际上并未说是有序的
/*
int pre = 0;
int tail = nums.length - 1;
while(nums[tail] + nums[pre] != target){
int ans = nums[tail] + nums[pre];
if(ans < target) pre++;
if(ans > target) tail--;
}
return new int[]{pre,tail};
*/
// 简单暴力
for(int i = 0; i < nums.length; i++){
for(int j = i+1; j <nums.length; j++){
if(nums[i] + nums[j] == target)return new int[]{i,j};
}
}
return null;
}
}
方法二:HashMap法
一遍扫描,时间复杂度为O(n),以空间换时间的做法;
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
final int len = nums.length;
for(int i = 0; i < len; i++){
if(map.containsKey(nums[i])){
return new int[]{map.get(nums[i]), i};
}
map.put(target - nums[i],i); // 存储对应元素的值和当前元素的下标
}
return null;
}
}