/** --------------------------------------------------------------------------- problem : ---------- - find first duplicate value in the given array without modifying the array. --------------------------------------------------------------------------- input : ---------- - int *a : array of integers - int l : number of elements in a - int m : loose upper bound for value of an element of array a. : 0 <= value_of_element_of_a < m - relation between l and m : l > m --------------------------------------------------------------------------- output : ---------- - first duplicate value occuring in the array. --------------------------------------------------------------------------- constraints : ------------- - space requirement should be O(1) - after the function returns the array should be same as original. --------------------------------------------------------------------------- /**/ //------------------------------------------------------------------------- int find_firstduplicate(int *a, int l, int m) { int original = 0; int index = 0; int is_index_already_used = 0; const int adjustment_for_zero_value = 1; int duplicate = -1; for(index = 0; index <= m; ++index) { is_index_already_used = 0; original = a[index]; if(a[index] < 0) { //means there is already an element with value = index is_index_already_used = 1; //reversing the step of procedure to handle zero value a[index] += adjustment_for_zero_value; //original value of the element original = abs(a[index]); } if(a[original] >= 0) { //negating a[original] = (- a[original]); //substracting 1, to handle zero value, since (minus ZERO) = (ZERO) a[original] = a[original] - adjustment_for_zero_value; //restoring the fact that index is used. a[index] -= is_index_already_used; } else { //duplicate found. duplicate = original; break; } } //readjusting the values of array so that they resemble the original. for(index = 0; index <= m; ++index) { if(a[index] < 0) { a[index] += adjustment_for_zero_value; a[index] = - a[index]; } } return duplicate; } //------------------------------------------------------------------------- /** --------------------------------------------------------------------------- solution : - hint : use the value of element as an index 'i' and negate the value at index i. - complexity : O(m) --------------------------------------------------------------------------- /**/ void main() { int m = 5; int a[] = {1, 0, 3, 0, 4, 5}; int l = sizeof(a) / sizeof(a[0]); int duplicate = find_firstduplicate(a, l, m); if(duplicate != -1) { cout << "first duplicate = " << duplicate << endl; } else { cout << "duplicate does not exist." << endl; } getch(); } /** output : -------- first duplicate = 0 /**/
Description : { int and char, for and if, while and else, struct, class, thread, mutex, thoughts, switch, >>, &&, patterns, member function, public and private, thoughts and messages, commands, tips and tricks; }
Monday, February 20, 2012
finding duplicate entry in an array.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment