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;
}