方法一:蛮力法
直接双重循环数组拍判断两个数是否相加等于20,但是这种方法的时间复杂度是O(n^2)。
方法二:排序法
首先将数组进行有小到大排序,将设从前到后遍历的下标为begin,而从后到前遍历的下标是end。如果arr[begin]+arr[end] > 20,那么说明end需要–。相反,如果arr[begin]+arr[end] < 20, 那么begin++。如果正好等于20,那么begin和end都进行改变(原数组中没有相同的值)。
代码实现:
首先排序算法选用性能较好稳定的快速排序
public static void quickSort(int[] arr, int low, int high) {
int i = low;
int j = high - 1;
if (low >= high) {
return;
}
int index = arr[i];
while (i < j) {
while (i < j && arr[j] >= index) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] <= index) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = index;
quickSort(arr, low, i);
quickSort(arr, i + 1, high);
}
然后编写findSum()方法
public static void findSum(int[] arr){
int begin = 0;
int end = arr.length-1;
while (begin < end){
if (arr[begin] + arr[end] > 20) {
end--;
}else if (arr[begin] + arr[end] < 20){
begin++;
}else {
System.out.println(arr[begin] +"+"+arr[end]);
begin++;
end--;
}
}
}
然后就是需要编写主方法
public static void main(String[] args) {
int[] arr = {1,7,17,2,6,3,14};
quickSort(arr,0, arr.length);
findSum(arr);
}