码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-22 09:55:44      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:htc   ext   rom   space   sorted   air   math   pre   geeks   

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

标签:htc   ext   rom   space   sorted   air   math   pre   geeks   

原文地址:http://www.cnblogs.com/lz87/p/7220208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!