Find the Kth Smallest Sum of a Matrix With Sorted Rows
May 26, 2022 by aAshish
Time:O(|\texttt{mat}| \cdot k\log k)
Space:O(k)
C++
structT{inti;intj;intsum;// nums1[i] + nums2[j]T(inti,intj,intsum):i(i),j(j),sum(sum){}};classSolution{public:intkthSmallest(vector<vector<int>>&mat,intk){vector<int>row=mat[0];for(inti=1;i<mat.size();++i)row=kSmallestPairSums(row,mat[i],k);returnrow.back();}private:// very similar to 373. Find K Pairs with Smallest Sumsvector<int>kSmallestPairSums(vector<int>&nums1,vector<int>&nums2,intk){vector<int>ans;autocompare=[&](constT&a,constT&b){returna.sum>b.sum;};priority_queue<T,vector<T>,decltype(compare)>minHeap(compare);for(inti=0;i<k&&i<nums1.size();++i)minHeap.emplace(i,0,nums1[i]+nums2[0]);while(!minHeap.empty()&&ans.size()<k){constauto[i,j,_]=minHeap.top();minHeap.pop();ans.push_back(nums1[i]+nums2[j]);if(j+1<nums2.size())minHeap.emplace(i,j+1,nums1[i]+nums2[j+1]);}returnans;}};
JAVA
classT{publicinti;publicintj;publicintsum;// nums1[i] + nums2[j]publicT(inti,intj,intsum){this.i=i;this.j=j;this.sum=sum;}}classSolution{publicintkthSmallest(int[][]mat,intk){int[]row=mat[0];for(inti=1;i<mat.length;++i)row=kSmallestPairSums(row,mat[i],k);returnrow[k-1];}// very similar to 373. Find K Pairs with Smallest Sumsprivateint[]kSmallestPairSums(int[]nums1,int[]nums2,intk){List<Integer>ans=newArrayList<>();Queue<T>minHeap=newPriorityQueue<>((a,b)->a.sum-b.sum);for(inti=0;i<k&&i<nums1.length;++i)minHeap.offer(newT(i,0,nums1[i]+nums2[0]));while(!minHeap.isEmpty()&&ans.size()<k){finalinti=minHeap.peek().i;finalintj=minHeap.poll().j;ans.add(nums1[i]+nums2[j]);if(j+1<nums2.length)minHeap.offer(newT(i,j+1,nums1[i]+nums2[j+1]));}returnans.stream().mapToInt(i->i).toArray();}}
Login to Codeflu
Log in to stay update and get notify on new arrivals.