算法思路:
蛮力法:两重遍历判断两个数组的和是否是20
排序法:1、先对数组进行排序 O(nlogn)
2、对排序后的数组分别从前往后和从后往前遍历,假设从前往后遍历的下标是begin,从后往前遍历的下标是end
2.1 当满足 arr[begin]+arr[end]<20时,那么这两个数一定在[begin+1,end]之间
2.2 当满足 arr[begin]+arr[end]>20时,那么这两个数一定在[begin,end-1]之间
这个过程时间复杂度为O(n)
算法时间复杂度: O(nlogn)
代码实现:
package JBArray;
import java.util.Arrays;
public class FindSumInArray {
/**
* 方法1:
* 蛮力法
* 时间复杂度O(n^2)
* @param a
* @param sum
*/
public static void findSumInArray1(int a[],int sum) {
int len = a.length;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (a[i] + a[j] == sum) {
System.out.println(a[i] +"," + a[j]);
}
}
}
}
/**
* 方法2:
* 排序法,可以利用堆排序或者快排,此时时间复杂度为O(nlogn)
* 然后只需要同时从头和尾遍历数组,直到满足low>high 这个过程时间复杂度为O(n)
* 所以整个算法时间复杂度为o(nlogn)
* @param a
* @param sum
*/
public static void findSumInArray2(int a[],int sum) {
//排序 排序算法最好的时间复杂度是O(nlogn)
Arrays.sort(a);
int low = 0;
int high = a.length - 1;
while (low < high) {
if (a[low] + a[high] < sum)
low++;
else if (a[low] + a[high] > sum)
high--;
else {
System.out.println(a[low] +"," + a[high]);
low++;
high--;
}
}
}
public static void main(String[] args) {
int a[] = {1,7,17,2,6,3,14};
findSumInArray1(a, 20);
System.out.println();
findSumInArray2(a, 20);
}
}