最直观的当然是暴力解:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int[] a, int sum) { ArrayList<Integer> ret = new ArrayList<>(); if (a == null || a.length < 2) return ret; for (int i = 0; i < a.length - 1; ++i) { for (int j = a.length - 1; j > i; --j) { if (a[i] + a[j] == sum) { ret.add(a[i]); ret.add(a[j]); return ret; } } } return ret; } }
由于是递增有序的数组,又想到了二分查找的方式:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int[] a, int sum) { ArrayList<Integer> ret = new ArrayList<>(); if (a == null || a.length < 2) { return ret; } for (int i = 0; i < a.length - 1; ++i) { int x = find(a, i + 1, a.length - 1, sum - a[i]); // 查找 sum - a[i] if (x != -1) { ret.add(a[i]); ret.add(a[x]); return ret; } } return ret; } private int find(int[] a, int start, int end, int k) { int ret = -1; while (end >= start) { int mid = (start + end) >> 1; if (a[mid] == k) { return mid; } else if (a[mid] < k) { start = mid + 1; } else { end = mid - 1; } } return ret; } }
看了一下题解,发现里面的双指针法非常巧妙,顺着思路实现了一下:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int[] a, int sum) { ArrayList<Integer> ret = new ArrayList<>(); if (a == null || a.length < 2) { return ret; } for (int i = 0, j = a.length - 1; i < j; ) { if (a[i] + a[j] == sum) { ret.add(a[i]); ret.add(a[j]); return ret; } else if (a[i] + a[j] > sum) { --j; } else { ++i; } } return ret; } }