[GeeksForGeeks] Find the largest pair sum in an unsorted array

Posted Push your limit!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[GeeksForGeeks] Find the largest pair sum in an unsorted array相关的知识,希望对你有一定的参考价值。

Given an unsorted array, find the largest pair sum.

 

Solution 1. O(n*logn) runtime, using sorting

 

Solution 2. O(n) runtime, using heapify (max priority queue)

Option 1. Use Java priority queue API, easy to implement but uses O(n) extra memory.

Option 2.  Since we are given an array, heapify the array to a max pq. This does not use extra memory.

Heapify takes O(n) runtime;

delete the max value from the heapified array takes O(logn) runtime as we need to percolate down the 

new head element.

 1 public class Solution {
 2     public int findLargestPair(int[] A){
 3         if(A == null || A.length <= 1){
 4             return Integer.MIN_VALUE;
 5         }
 6         heapify(A);
 7         int firstMax = A[0], secondMax = 0;
 8         A[0] = A[A.length - 1];
 9         percolateDown(A, A.length - 1, 0);
10         secondMax = A[0];
11         return firstMax + secondMax;
12     }
13     private void heapify(int[] A){
14         for(int i = A.length / 2 - 1; i >= 0; i--){
15             percolateDown(A, A.length, i);
16         }
17     }
18     private void percolateDown(int[] A, int len, int idx){
19         int maxIdx = idx;
20         int leftChildIdx = 2 * idx + 1;
21         int rightChildIdx = 2 * idx + 2;
22         if(leftChildIdx < len && A[leftChildIdx] > A[maxIdx]){
23             maxIdx = leftChildIdx;
24         }
25         if(rightChildIdx < len && A[rightChildIdx] > A[maxIdx]){
26             maxIdx = rightChildIdx;
27         }
28         if(maxIdx != idx){
29             int temp = A[idx];
30             A[idx] = A[maxIdx];
31             A[maxIdx] = temp;
32             percolateDown(A, len, maxIdx);
33         }
34     }
35 }

 

Solution 3. O(n) runtime, O(1) space, scan the input array once and upate the largest and second largest values along the way.

 1 public int findLargestPair(int[] A){
 2     if(A == null || A.length <= 1){
 3         return Integer.MIN_VALUE;
 4     }
 5     int firstMax = Math.max(A[0], A[1]);
 6     int secondMax = Math.min(A[0], A[1]);
 7     for(int i = 2; i < A.length; i++){
 8         if(A[i] >= firstMax){
 9             secondMax = firstMax;
10             firstMax = A[i];
11         }
12         else if(A[i] > secondMax){
13             secondMax = A[i];
14         }
15     }
16     return firstMax + secondMax;
17 }

 

以上是关于[GeeksForGeeks] Find the largest pair sum in an unsorted array的主要内容,如果未能解决你的问题,请参考以下文章

[GeeksForGeeks] Find if there is a pair with a given sum in a sorted and rotated array.

lucene中facet实现统计分析的思路——本质上和word count计数无异

geeksforgeeks@ Largest Number formed from an Array

LeetCode 564. Find the Closest Palindrome

287. Find the Duplicate Number

find-the-difference