zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    未设置BufferSize导致FTP下载速度过慢的问题
    Ant Problem: failed to create task or type foreach 问题
    关于iOS Tabbar的一些设置
    eeplat开发平台概念理解
    swift菜鸟入门视频教程-05-控制流
    iOS多线程与网络开发之多线程概述
    hdu 1686 Oulipo
    记一次理想浪漫的毕旅
    LeetCode:Subsets II
    DNA分子结构3D模型
  • 原文地址:https://www.cnblogs.com/lz87/p/7220208.html
Copyright © 2011-2022 走看看