包含N个数的数组,求所有和为16的两个数字的组合
首先用快排对数组进行排序
然后用类似快排的方法用两个指针从头尾进行相加,时间复杂度排序为O(nlogn),找组合为O(n)
用Java实现的:
public class test1 {
private static int arr[]={9,3,5,12,21,7};
public static void qsort(int i,int j){
if(j>i){
int medium=onesort(i,j);
qsort(i,medium-1);
qsort(medium+1,j);
}
}
public static int onesort(int i,int j){
int target=arr[i];
boolean iTurn=false;
while(i<j){
if(iTurn){
if(arr[i]>target){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
iTurn=false;
}else{
i++;
}
}else{
if(arr[j]<target){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
iTurn=true;
}else{
j--;
}
}
}
return i;
}
public static void main(String args[]){
int i=0;
int j=arr.length-1;
qsort(0,arr.length-1);
for(int k=0;k<arr.length;k++){
System.out.println(arr[k]);
}
while(i<j){
if(arr[i]+arr[j]==16){
System.out.println(arr[i]+"+"+arr[j]);
i++;
j--;
}else if(arr[i]+arr[j]>16){
j--;
}else if(arr[i]+arr[j]<16){
i++;
}
}
}
}