给定一个数组,找到总和到给定值的所有nos对.有一种经典的O(n)算法,在前后保持2个指针,使它们更接近找到对.这只会导致1对.如果你想要所有配对怎么办?额外奖励:找到最小距离对.
你能在O(n)中做到这一点.
int arr[SIZE]; /* sorted in ascending order */
int a = 0, b = SIZE - 1, mindist = -1, sum;
while (a < b) {
sum = arr[a] + arr[b];
if (sum == TARGET) { report_pair(a, b); mindist = b - a; a++ }
else if (sum < TARGET) a++;
else b--;
}
/* minimum distance stored in mindist */
Run Code Online (Sandbox Code Playgroud)
public static void main(String[] args) {
int[] nums = new int[] { 1,2,3,4,5,6,7,8,9};
Hashtable reqNoList=new Hashtable();
int sum=6;
int minPair=0,i=0,count=0;
// just remove the second condition for unsorted array
while(i<nums.length && i<sum){
int key=sum-nums[i];
if(reqNoList.containsKey(nums[i])){
Integer temp=(Integer) reqNoList.get(nums[i]);
System.out.println("("+key+","+nums[i]+")");
if(count==0)
minPair=i-temp;
else if((i-temp)< minPair)
minPair=i-temp;
count++;
}else
reqNoList.put(key,i);
i++;
}
System.out.println("min Distance -->"+minPair);
}
Run Code Online (Sandbox Code Playgroud)