题目链接1
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i =0; i < nums.length; i++) {
if(map.containsKey(target-nums[i])) {
return new int[]{i,map.get(target-nums[i])};
}
map.put(nums[i],i);
}
return null;
}
}
题目链接2
class Solution {
public int[] twoSum(int[] numbers, int target) {
// return violence(numbers, target);
// return binary(numbers, target);
return twoPoint(numbers, target);
}
// 1.暴力解法
public int[] violence(int[] n, int target) {
int len = n.length;
for(int i = 0; i < len-1; i++) {
for(int j = i+1; j < len; j++) {
if((n[i]+n[j]) > target) break; // 剪枝一下,否则过不了。
if((n[i]+n[j])==target) return new int[]{i+1,j+1};
}
}
return new int[]{0};
}
// 2.二分法,二分的时间复杂度是logN
public int[] binary(int[] n, int target) {
int len = n.length;
for(int i = 0; i < len; i++) {
int left = i+1, right = len-1;
while (left <= right) {
int mid = (right - left) / 2 + left;
if (n[mid] == target - n[i]) {
return new int[]{i + 1, mid + 1};
} else if (n[mid] > target - n[i]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
return new int[]{0};
}
// 3.双指针
public int[] twoPoint(int[] n, int target) {
int left = 0,right = n.length-1;
while(left < right) {
int num = n[left]+n[right];
if(num == target) {
return new int[]{left+1, right+1};
} else if(num < target) {
left++;
} else {
right--;
}
}
return new int[]{-1,-1};
}
}