image.png

    1. public class Test {
    2. public static void main(String[] args) {
    3. System.out.println(Arrays.toString(twoSeach(new int[]{1,2,3,4,5,6},10)));
    4. System.out.println(Arrays.toString(twoPoint(new int[]{1,2,3,4,5,6},10)));
    5. }
    6. /**
    7. * 双指针,时间复杂度O(n),空间复杂度O(1)
    8. * @param arr
    9. * @param target
    10. * @return
    11. */
    12. private static int[] twoPoint(int[] arr, int target) {
    13. int left = 0, right = arr.length - 1;
    14. while (left < right) {
    15. if (arr[left] + arr[right] == target) {
    16. return new int[]{left, right};
    17. } else if (arr[left] + arr[right] > target){
    18. right--;
    19. } else {
    20. left++;
    21. }
    22. }
    23. return new int[]{0};
    24. }
    25. /**
    26. * 二分查找
    27. * @param arr
    28. * @param target
    29. * @return
    30. */
    31. private static int[] twoSeach(int[] arr, int target) {
    32. // 二分查找法,先循环固定一个值
    33. for (int i = 0; i < arr.length; i++) {
    34. // 起始指针每次循环+1
    35. int start = i,end = arr.length - 1;
    36. while (start <= end) {
    37. int middle = start + (end - start)/2;
    38. if (arr[middle] == target - arr[i]) {
    39. return new int[]{i, middle};
    40. } else if (arr[middle] > target - arr[i]){
    41. end = middle - 1;
    42. } else {
    43. start = middle + 1;
    44. }
    45. }
    46. }
    47. return new int[]{0};
    48. }
    49. }