• [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 }
  • 相关阅读:
    linux学习(一)
    Linux学习(用户管理)
    anyproxy mac安装
    python mitmproxy 代理
    Js常用方法map, sort
    echarts常用配置项【持续更新】
    【转】moment js 使用
    js Cannot assign to read only property 'exports' of object '#<Object>' at Modul,import 与module.exports混用问题
    a标签跳转referer漏洞
    element ui rate评分组建使用
  • 原文地址:https://www.cnblogs.com/lz87/p/7220208.html
Copyright © 2020-2023  润新知