一道Google算法题:给一个长度为2N的非负整数数组arr。现在每次删除最左端或最右端的元素,重复N次为止。请返回被删掉的数字之和最大是多少。
2019-08-07 11:39
886 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36963214/article/details/98731962
题目链接:https://www.nowcoder.com/discuss/205633?type=2&order=3&pos=184&page=1
题目来源:牛客网
题目描述
2、给一个长度为2N的非负整数数组arr。现在每次删除最左端或最右端的元素,重复N次为止。请返回被删掉的数字之和最大是多少。
例:
- [1,2,3,4] => 4 + 3 = 7
- [1,100,2,8] => 1 + 100 = 101
- [98, 52, 67, 89]=> 98+89 = 187
解题思路:滑动窗口
学过计算机网络的人应该都知道有滑动窗口这个概念。这里设置一个长度为N的滑动窗口,假设有 [a, b, c, d, e, f , g, h,i]。算法步骤如下:
- 1、滑动窗口取左区间,滑动窗口的内容为[a, b, c, d],作如下计算:
max=a+b+c+d; tmp = max;
- 2、滑动窗口移动一个位置,此时滑动窗口的内容为[i, a, b, c], 作如下判断:
tmp = tmp - d + i; if tmp > max: max = tmp
- 3、重复步骤2,直至滑动窗口为[f, g, h, i], 此时的max是解。
上述算法的滑动窗口变化如下:
1、[a, b, c, d] 2、[i, a, b, c] 3、[h, i, a, b] 4、[g, h, i, a] 5、[e, f, g, h] 求出每个滑动窗口的值,取最大值就是这题的解。
算法实现
#include<stdio.h> unsigned long long slide_window(const int *arr, unsigned int size) { unsigned int half = size / 2; unsigned int i, j; unsigned long long max, tmp; max = 0; tmp = 0; for (i = 0; i < half; i++) { // here, variable max may overflow in real produce environment. max += (unsigned long long)arr[i]; } tmp = max; for (j = 0; j < half; j++) { i--; // here, variable tmp may overflow in real produce environment. tmp = tmp - (unsigned long long)arr[i] + (unsigned long long)arr[size-j-1]; if (tmp > max) { max = tmp; } } return max; } int main() { unsigned int arr[] = {4, 9, 130, 21, 10, 2, 100, 33, 1, 3}; unsigned long long result = 0; result = slide_window(arr, sizeof(arr)/sizeof(unsigned int)); printf("result is: %lld", result); return 0; }
相关文章推荐
- 每日算法(十五)-java给定一个有序数组,删除其中重复元素,只保留一个,并返回新数组的长度
- 删除有序数组中的重复元素,返回数组的新长度,但允许最大重复次数为2
- 给定一个排序数组,删除重复的位置,使每个元素只出现一次,并返回新的长度。
- 给定一个数组arr和一个目标数targrt,删除所有目标值元素,并返回新长度
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 删除有序数组中的重复元素,并返回数组的新长度
- Leetcode:给定一个数组和一个值,删除该数组中等于该值的元素并返回新的长度。 数组元素的顺序可以改变。
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- java__给定一个非负整数数组,假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。
- 在一个长度为10的整形数组中,前9个元素是{12,23,34,45,56,67,78,89,90}。 现在要求输入一个整数,把它放到数组中正确的位置当中。(不能删除已有元素)
- 给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- 算法22:给定一个排好序的linked list,删除其中所有的重复元素。比如给定1->2->3->3-> 4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 删除有序数组中重复元素的一个非常简洁的算法
- 一个能将给定非负整数数组中的数字排列成最大数字的函数(数组元素长度随机)
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- 有序整型数组A,大小为n,请给出一个O(n)的算法,删除重复元素,O(1)空间