题目链接1

    1. class Solution {
    2. public int[] twoSum(int[] nums, int target) {
    3. HashMap<Integer,Integer> map = new HashMap<>();
    4. for(int i =0; i < nums.length; i++) {
    5. if(map.containsKey(target-nums[i])) {
    6. return new int[]{i,map.get(target-nums[i])};
    7. }
    8. map.put(nums[i],i);
    9. }
    10. return null;
    11. }
    12. }

    题目链接2
    image.png

    1. class Solution {
    2. public int[] twoSum(int[] numbers, int target) {
    3. // return violence(numbers, target);
    4. // return binary(numbers, target);
    5. return twoPoint(numbers, target);
    6. }
    7. // 1.暴力解法
    8. public int[] violence(int[] n, int target) {
    9. int len = n.length;
    10. for(int i = 0; i < len-1; i++) {
    11. for(int j = i+1; j < len; j++) {
    12. if((n[i]+n[j]) > target) break; // 剪枝一下,否则过不了。
    13. if((n[i]+n[j])==target) return new int[]{i+1,j+1};
    14. }
    15. }
    16. return new int[]{0};
    17. }
    18. // 2.二分法,二分的时间复杂度是logN
    19. public int[] binary(int[] n, int target) {
    20. int len = n.length;
    21. for(int i = 0; i < len; i++) {
    22. int left = i+1, right = len-1;
    23. while (left <= right) {
    24. int mid = (right - left) / 2 + left;
    25. if (n[mid] == target - n[i]) {
    26. return new int[]{i + 1, mid + 1};
    27. } else if (n[mid] > target - n[i]) {
    28. right = mid - 1;
    29. } else {
    30. left = mid + 1;
    31. }
    32. }
    33. }
    34. return new int[]{0};
    35. }
    36. // 3.双指针
    37. public int[] twoPoint(int[] n, int target) {
    38. int left = 0,right = n.length-1;
    39. while(left < right) {
    40. int num = n[left]+n[right];
    41. if(num == target) {
    42. return new int[]{left+1, right+1};
    43. } else if(num < target) {
    44. left++;
    45. } else {
    46. right--;
    47. }
    48. }
    49. return new int[]{-1,-1};
    50. }
    51. }