Skip to main content

Amazon’s most asked interview questions

k largest(or smallest) elements in an array | added Min Heap method

Question: Write an efficient program for printing k largest elements in an array. Elements in array can be in any order.
For example, if given array is [1, 23, 12, 9, 30, 2, 50] and you are asked for the largest 3 elements i.e., k = 3 then your program should print 50, 30 and 23.

Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.


Method 1 (Use Bubble k times)

Thanks to Shailendra for suggesting this approach.
1) Modify Bubble Sort to run the outer loop at most k times.
2) Print the last k elements of the array obtained in step 1.
Time Complexity: O(nk)
Like Bubble sort, other sorting algorithms like Selection Sort can also be modified to get the k largest elements.
Method 2 (Use temporary array)
K largest elements from arr[0..n-1]
1) Store the first k elements in a temporary array temp[0..k-1].
2) Find the smallest element in temp[], let the smallest element be min.
3) For each element x in arr[k] to arr[n-1]
If is greater than the min then remove min from temp[] and insert x.
4) Print final k elements of temp[]
Time Complexity: O((n-k)*k). If we want the output sorted then O((n-k)*k + klogk)
Thanks to nesamani1822 for suggesting this method.
Method 3(Use Sorting)
1) Sort the elements in descending order in O(nLogn)
2) Print the first k numbers of the sorted array O(k).
Time complexity: O(nlogn)
Method 4 (Use Max Heap)
1) Build a Max Heap tree in O(n)
2) Use Extract Max k times to get k maximum elements from the Max Heap O(klogn)
Time complexity: O(n + klogn)
Method 5(Use Oder Statistics)
1) Use order statistic algorithm to find the kth largest element. Please see the topic selection in worst-case linear time O(n)
2) Use QuickSort Partition algorithm to partition around the kth largest number O(n).
3) Sort the k-1 elements (elements greater than the kth largest element) O(kLogk). This step is needed only if sorted output is required.
Time complexity: O(n) if we don’t need the sorted output, otherwise O(n+kLogk)
Method 6 (Use Min Heap)
This method is mainly an optimization of method 1. Instead of using temp[] array, use Min Heap.

1) Build a Min Heap MH of the first k elements (arr[0] to arr[k-1]) of the given array. O(k)
2) For each element, after the kth element (arr[k] to arr[n-1]), compare it with root of MH.
……a) If the element is greater than the root then make it root and call heapify for MH
……b) Else ignore it.
// The step 2 is O((n-k)*logk)
3) Finally, MH has k largest elements and root of the MH is the kth largest element.
Time Complexity: O(k + (n-k)Logk) without sorted output. If sorted output is needed then O(k + (n-k)Logk + kLogk)
All of the above methods can also be used to find the kth largest (or smallest) element.

2. Pythagorean Triplet in an array
Given an array of integers, write a function that returns true if there is a triplet (a, b, c) that satisfies a2+ b2 = c2.
Example:
Input: arr[] = {3, 1, 4, 6, 5}
Output: True
There is a Pythagorean triplet (3, 4, 5).

Input: arr[] = {10, 4, 6, 12, 5}
Output: False
There is no Pythagorean triplet.


Method 1 (Naive)
A simple solution is to run three loops, three loops pick three array elements and check if current three elements form a Pythagorean Triplet.
Below is implementation of simple solution.
// A C++ program that returns true if there is a Pythagorean
// Triplet in a given aray.
#include <iostream>
using namespace std;
 
// Returns true if there is Pythagorean triplet in ar[0..n-1]
bool isTriplet(int ar[], int n)
{
    for (int i=0; i<n; i++)
    {
       for (int j=i+1; j<n; j++)
       {
          for (int k=j+1; k<n; k++)
          {
            // Calculate square of array elements
            int x = ar[i]*ar[i], y = ar[j]*ar[j], z = ar[k]*ar[k];
 
            if (x == y + z || y == x + z || z == x + y)
                 return true;
          }
       }
    }
 
    // If we reach here, no triplet found
    return false;
}
 
/* Driver program to test above function */
int main()
{
    int ar[] = {3, 1, 4, 6, 5};
    int ar_size = sizeof(ar)/sizeof(ar[0]);
    isTriplet(ar, ar_size)? cout << "Yes": cout << "No";
    return 0;
}


Comments

Popular posts from this blog

Amazon Tree traversal Questions | Amazon interview Questions

The following function is supposed to calculate the maximum depth or height of a Binary tree -- the number of nodes along the longest path from the root node down to the farthest leaf node. int maxDepth( struct node* node) {     if (node==NULL)         return 0;     else     {         /* compute the depth of each subtree */         int lDepth = maxDepth(node->left);         int rDepth = maxDepth(node->right);             /* use the larger one */         if (lDepth > rDepth)             return X;         else return Y;     } } What should be the values of X and ...

TCS placement paper 13

1) Two pipes A and B fill at A certain rate B is filled at 10,20,40,80,. If 1/16 of B if filled in 17 hours what time it will take to get completely filled Ans 21 2) In a shopping mall with a staff of 5 members the average age is 45 years. After 5 years a person joined them and the average age is again 45 years. What’s the age of 6th person? 3) Find (4x+2y)/ (4x-2y) if x/2y=2 4) Find average speed if a man travels at speed of 24kmph up and 36kmph down at an altitude of 200m. Formula is 2xy/(x+y) 5) Same model as 4th question. But it is on flat surface. Formula is same 2xy/(x+y). 6) Six friends go to pizza corner there are 2 types of pizzas. And six different flavors are there they have to select 2 flavors from 6 flavors. In how many ways we can select? Ans: 6C2 7) 3, 15, x, 51, 53,159,161. Find X Ans: 17 8) 3 friends A, B, C went for week end party to McDonald’s restaurant and there they measure there weights in some order IN 7 rounds. A;B;C;A...