package com.interview.misc; import com.interview.graph.BinaryMinHeap; /** * Kth largest in rowwise and column wise sorted array * http://www.geeksforgeeks.org/kth-smallest-element-in-a-row-wise-and-column-wise-sorted-2d-array-set-1/ */ public class KthLargestInRowiseColumnWiseSorted2DArray { public int kthLargest(int input[][],int k){ BinaryMinHeap<Integer> minHeap = new BinaryMinHeap<Integer>(); int c = input[0].length; int total = input.length * c; minHeap.add(input[0][0], 0); for(int i=1; i < k; i++){ int minIndex = minHeap.extractMin(); int minRow = minIndex/c; int minCol = minIndex%c; int downNeighbor = (minRow+1)*c + minCol; int rightNeighbor; if(minCol== (c-1)){ rightNeighbor = total; }else{ rightNeighbor = minRow*c + (minCol + 1); } if(downNeighbor < total && !minHeap.containsData(downNeighbor)){ minHeap.add(input[minRow+1][minCol], downNeighbor); } if(rightNeighbor < total && !minHeap.containsData(rightNeighbor)){ minHeap.add(input[minRow][minCol+1], rightNeighbor); } } int minIndex = minHeap.extractMin(); return input[minIndex/c][minIndex%c]; } public static void main(String args[]){ int input[][] ={{1,5,11,21}, {6,8,12,22}, {7,9,15,26}, {11,13,18,28}}; KthLargestInRowiseColumnWiseSorted2DArray kl = new KthLargestInRowiseColumnWiseSorted2DArray(); System.out.println(kl.kthLargest(input, 10)); } }