/*
* Author: Yang Pei
* Problem: Search the missing element in Arithmetic Progression
* Source: http://www.geeksforgeeks.org/find-missing-number-arithmetic-progression/
*
* Note:
* Given an arithmetic progression, find the missing elements in it. Assume that there
* exist exact one missing element in it (the head and tail is not missing).
*
* Solution:
* Naive method is to sweep the entire array to find the missing element.
* Binary search the array. Pay attention how to cut off the search space.
*
* Follow up:
* Given a array from 1 ... N and it is sorted, however, m number is missing.
* Find all missing numbers.
* Since the missing number could be appear in the two end of the array, we need
* to check if the current array contains enough position or not, if not, we need
* to add missing numbers from two ends.
*/
import java.util.*;
public class SearchinArithmeticProgression {
public static int findMissing(int[] A) {
int n = A.length;
int diff = (A[n-1] - A[0]) / n;
int l = 0, r = n-1;
while(l < r) {
if(r - l == 1)
return A[r] - diff;
int mid = l + (r - l) / 2;
int temp = (mid - l) * diff + A[l];
if(A[mid] == temp)
l = mid;
else
r = mid;
}
return A[r] - diff;
}
public static void findMissing1(int[] A, int l, int r, int N, int m, List<Integer> result) {
// check if there is missing element on both ends of the array
int count = (A[r] - A[l]) - (r - l);
if(m > count) {
for(int i = 1; i < A[l]; i++)
result.add(i);
for(int i = A[r] + 1; i <= N; i++)
result.add(i);
}
if(r - l == 1) {
for(int i = 1; i <= m; i++)
result.add(A[l] + i);
}
else {
// half the array and try to find the missing elements recursively
int mid = l + (r - l) / 2;
int left = (A[mid] - A[l]) - (mid - l);
int right = (A[r] - A[mid]) - (r - mid);
if(left != 0)
findMissing1(A, l, mid, N, left, result);
if(right != 0)
findMissing1(A, mid, r, N, right, result);
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
List<Integer> result = new ArrayList<Integer>();
int n = scan.nextInt();
int m = scan.nextInt();
int[] A = new int[n-m];
for(int i = 0; i < n-m; i++)
A[i] = scan.nextInt();
findMissing1(A, 0, n-m-1, n, m, result);
System.out.println(result.toString());
}
scan.close();
}
}
2015年1月20日星期二
Search the missing element in Arithmetic Progression
订阅:
博文评论 (Atom)
没有评论:
发表评论