题目链接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}; }}