欢迎光临
我们一直在努力

【笔试】算法的暴力美学——牛客 NC221681:dd爱框框

一、题目描述

二、算法原理

思路:滑动窗口

1)定义两个指针,一开始都为0,cur 从左开始遍历,定义一个 sum 来表示 prev 到 cur 的之间的值的总和,当 sum >= x 时,我们要根据题目条件来保存 prev 和 cur 的值;

2)当 sum >= x 时,我们记录完 prev 和 cur 的值的之后,sum -= arr[ prev ],prev++ ,往后走,只要满足条件 sum >= x 我们就要记录 prev 和 cur 的值,不断重复上面的工作;

3)当 sum < x 时,cur++,sum += arr[ cur ];

4)直至遍历完整个数组;

三、代码实现

#include <iostream>
#include <vector>
using namespace std;

int main()
{
//准备工作
int n,x;
cin >> n >> x;
vector<int> arr(n,0);

for(int i = 0; i < n; i++) cin >> arr[i];
int index[2] = {0};//保存最后的结果

//滑动窗口
int cur = 0;
int prev = 0;
int sum = 0;
while(cur < n)
{
sum += arr[cur];
while(sum >= x)//入窗口
{
if(index[0] == 0 && index[1] == 0)
{
index[0] = prev;
index[1] = cur;
sum -= arr[prev++];
continue;
}
int length = index[1] – index[0];
int camplen = cur – prev;
if(length == camplen || length > camplen)
{
if(prev < index[0] || length > camplen)
{
index[0] = prev;
index[1] = cur;
}
}
sum -= arr[prev++];
}
//出窗口
cur++;
}

cout << index[0] + 1 << ' ' << index[1] + 1 << endl;

return 0;
}

赞(0)
未经允许不得转载:171主机测评 » 【笔试】算法的暴力美学——牛客 NC221681:dd爱框框
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址