今日头条 - 区间最大值 - 代码参考

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
	int n, dis = 1;
	vector<int> result;
	vector<int> a;
	cin >> n;
	for (int i = 0; i < n; i++){
		int temp;
		cin >> temp;
		a.push_back(temp);
	}
	for (int m = 0; m < n; m++){
		for (int i = 0; i < dis; i++){
			for (int j = i; j < n; j += dis){
				int min = a[j], sum = 0;
				if (n - j < dis)
					break;
				for (int k = j; k < j + dis; k++){
					if (a[k] < min)
						min = a[k];
					sum += a[k];
				}
				result.push_back(sum * min);				
			}
		}
		if (++dis > n - 1)
			break;
	}
	sort(result.begin(), result.end());		
	cout << result[result.size() - 1];	
	return 0;
}

#字节跳动#
全部评论
最外层循环m为切分次数:总共切分n次; 第二层循环,i为切分开始位置,dis为切分区间长度, 第三层循环,以i为起点,dis为步进距离,切分整个数组,if判断剩余元素数是否足够作为一个区间 第三层循环内部即对各个区间进行求和,以及寻找该区间最小值 result数组存储每个区间最小值与区间元素之和的乘积 最后,排序result数组,最大值即为结果
点赞 回复 分享
发布于 2017-08-23 12:14
其实最外层循环遍历最小值,内层循环找最小值存在的空间就好了,复杂度是100*500000
点赞 回复 分享
发布于 2017-08-23 12:47
一看就超时,这种死算逻辑肯定不是最优解
点赞 回复 分享
发布于 2017-08-23 12:45
我是用单调队列做的,对于第i个点,从左到右维护最小值可以确定最左边的坐标,从右到左确定最右边的坐标。
点赞 回复 分享
发布于 2017-08-23 12:29
欢迎来讨论,求大佬指导~
点赞 回复 分享
发布于 2017-08-23 12:06

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务