Two sorted elements with maximum distance in an unsorted array - PrismoSkills



Two sorted elements with maximum distance in an unsorted array - PrismoSkills

Problem: Given an unsorted array, find two indexes in the array such that arr[i] < arr[j] and j-i is maximum.

Example: If the array is [7, 3, 9, 2, 1, 11, 0], 7 and 11 are the solution.


Solution: A naive solution is O(n2) where we loop over entire array and at each loop-position, check the elements towards its right for greater elements max distance far.

For a more efficient solution, we will need to analyze some properties of the problem.

Note that for any solution i and j, the value (j-i) has to be maximum which means that no element towards right of j can be greater than arr[j].
Because if there were such an element, then that element would have been part of the solution and not arr[j].
Similarly, if i and j are a solution, then no element to left of arr[i] is smaller than arr[i].

Thus, if we create two arrays IndexOfLeftMinimum and IndexOfRightMaximum for every element in the array, then the solution is just the maximum value of IndexOfRightMaximum[k] - IndexOfLeftMinimum[k].

Does this really work?
Note that the for i,j to be a solution, a[i] is the minimum from 0 to i and a[j] is the maximum from j to a.length
One could get confused here in thinking that there could be an index k to the right of j such that a[k] < a[j] but a[k] > a[i]
(i.e. an element lesser than a[j] existing in the right-side of j but greater than a[i])

If such an element were to exist, then wouldn't (i,k) form the solution instead of (i,j)?
Answer to this question is yes, but our original observation holds here again that if (i,k) were the solution, then
there would be no element bigger than a[k] towards the right of k.

Then do we have two solutions here: (i,j) and (i,k)?
Answer to that is also yes but since we need to choose the maximum, we will choose (i,k)
And that is what happens in the last loop of the below code.

Read full article from Two sorted elements with maximum distance in an unsorted array - PrismoSkills


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts