📜  Google 现场面试(大学毕业生 - 2020 年)

📅  最后修改于: 2022-05-13 01:58:25.298000             🧑  作者: Mango

Google 现场面试(大学毕业生 - 2020 年)

问题:给定一个包含 2n 个元素的数组,您可以从数组的任一端选择 n 个元素,这样获得的值就会产生最大和。

例子:

Input : 1 3 100 25 20 4  
Output : 103 

方法:最初,我尝试递归方法,通过显示一个元素的两种可能性,它可以被包含或排除,但他告诉优化它,我想出了前缀和方法。
想法:前缀和方法背后的主要想法是,如果我们从左侧选择“x”个元素,我们可以从右侧选择“nx”个元素。

int function(int arr[])
{
    Int n = arr.size();
    Int lpref[n], rpref[n]; // for left and right prefix sum
    Lpref[0] = arr[0], rpref[n - 1] = arr[n - 1];
    For(int i = 1; i < n; i++)
    {
        Lpref[i] = Lpref[i - 1] + arr[i];
    }
    For(int i = n - 2; i >= 0; i--)
    {
        rpref[i] = rpref[i + 1] + arr[i];
    }
    Int maxm = INT_MIN, m = n / 2;
    For(int i = 0; i < m - 1; i++)
    {
maxm =max(maxm, lpref[i]+rpref[n-1-i];
    }
    maxm = max(maxm, lpref[m - 1]);
    maxm = max(maxm, rpref[n - m]);
    return maxm;
}