Describe a O(nlgn)-time algorithm that,given a set S of n integers and another integer x,determines whether or not there exist two elements in S whose sum is exactly x.
类似于TwoSum类的问题,这里只是让返回是否存在二者之和恰好是x。只需要经过排序,然后采用对撞指针的方法来实现判断。
public static boolean TwoSum(int []arr,int target) throws Exception { if (arr==null||arr.length==0){ throw new Exception("数组异常"); } int i=1; int j=arr.length; MergeSort(arr,i-1,j-1); while (i<j){ if (arr[i]+arr[j]==target){ return true; }else if (arr[i]+arr[j]<target) { i++; }else { j--; } } return false; } public static void MergeSort(int []arr,int start,int end){ int mid=start+(end-start)/2; MergeSort(arr,start,mid); MergeSort(arr,mid+1,end); merge(arr,start,mid,end); } private static void merge(int[] arr, int start, int mid, int end) { int [] help=new int[arr.length]; int p=start; int q=mid+1; int i=0; while(p<=mid&&q<=end){ help[i++]=arr[p]<arr[q]?arr[p++]:arr[q++]; } if (p<=mid){ help[i++]=arr[p++]; } if (q<=end){ help[i++]=arr[q++]; } for (int j=0;j<arr.length;j++){ arr[j]=help[j]; } }