大家讨论下,找一个数组中,可用区间的个数

pgmvo 2012-07-05 08:28:19
一个给定长度的数组A[LEN],数组的元素为0或者1,给定一个区间的长度area_len,
需要在数组A中,找到2个长度为area_len的区间,它们中允许元素为1的总数不超过
11,我想了一下,除了简单的遍历,实在想不出有什么好的算法可以比较漂亮的解决这个问题。
大家讨论下。
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2012-08-09
  • 打赏
  • 举报
回复
用大整数位运算能不能更好些?
DeDeWo 2012-08-06
  • 打赏
  • 举报
回复
如果是 m 次询问的话,朴素的做法的是 m*O(n) .
用线段树的话是O(n*logn + m*logn)
谨行 2012-08-05
  • 打赏
  • 举报
回复
楼主给你推荐一种算法
线段树
具体线段树是什么,我也没法说的很详细,这里只是给你提供一种思路,希望可以帮到你
数据结构可以这样
struct tree
{
int left;//区间左端点
int right;//区间右端点
int sum;//该区间内1的总个数
}
注意怎么构造,和查询线段树就可以了
yyfhz 2012-07-06
  • 打赏
  • 举报
回复
3L的算法对吗?我怎么觉得算出来的i和j两个区间永远是粘在一起的呢?
pgmvo 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
就目前的信息,看上去好像没有更优化的解法
元素为1的个数小于11,等价于0的个数大于等于area_len - 11,
如果area_len - 11比较小,判断0的个数更简单一些,但是仍然要用遍历的方法。
如果问题复杂一些,也许有相对简单的方法,比如知道0的分布规律之类的。
[/Quote]

0的分布都是随机的,没有规律。
pgmvo 2012-07-06
  • 打赏
  • 举报
回复
非常感谢各位的回答,还有更好的想法吗?如果使用遍历,确实已经有两三种方式可以实现。
cloudszhang 2012-07-05
  • 打赏
  • 举报
回复
看上去遍历每次搜索元素1的个数可以优化一下。但仍然是o(n)的。
比如从元素a1,a2, a3, ... a(area_len),求和。然后下次需要参考的序列是a2, a3, ...a(area_len), a(area_len + 1),只需要对上次的和减去a1, 加上a(area_len + 1)即可。
pandm 2012-07-05
  • 打赏
  • 举报
回复
这是O(n)的实现




#include <vector>
#include <utility>
#include <cstdio>
int area_len;
int N;
using namespace std;
vector<int> a;

pair<int, int> solve() {
int fst, snd;


fst = 0;
for (int k = 0; k <= area_len - 1; ++k) fst += a[k];

snd = 0;
for (int k = area_len; k <= 2 * area_len - 1; ++k) snd += a[k];

int curMin = 999999;

int j = 2 * area_len;
int i = area_len;

while(1) {
fst = fst + a[i] - a[i - area_len];
snd = snd + a[j] - a[j - area_len];
curMin = min(curMin, fst);

if (snd + curMin <= 11) return make_pair(i, j);

j += 1;
i += 1;

if (j > N) return make_pair(-1, -1);
}

}

int main() {
printf("LEN=? area_len=?\n");
scanf("%d %d", &N, &area_len);
a.resize(N + 3);
int i;
for (i = 1; i <= N; ++i) scanf("%d", &(a[i]));
a[0] = 0;
pair<int, int> r = solve();
printf("[%d,%d] [%d,%d]\n", r.first - area_len + 1, r.first, r.second - area_len + 1, r.second);
return 0;
}



cloudszhang 2012-07-05
  • 打赏
  • 举报
回复
就目前的信息,看上去好像没有更优化的解法
元素为1的个数小于11,等价于0的个数大于等于area_len - 11,
如果area_len - 11比较小,判断0的个数更简单一些,但是仍然要用遍历的方法。
如果问题复杂一些,也许有相对简单的方法,比如知道0的分布规律之类的。
pandm 2012-07-05
  • 打赏
  • 举报
回复
用遍历还不漂亮吗?都O(n)的复杂度了

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧