algorithm - 查找范围和等于数组大小的算法
问题描述
我有一个自然数大小为 n 的数组 A。我需要在 O(n) 中找到 2 个索引的算法:i 和 j,因此子数组 A[i...j] 的总和将除以 n,没有余数。
例如:如果我有这个数组:
5、16、10、3、5、11
总和 10+3+5 = 18 除以 n ( = 6 ) 的大小,没有余数。
我不知道该怎么做,但我知道需要模数组。
有什么建议么?
解决方案
用模数存储前缀和数组n
,让我们调用这个数组 pref_sum[]
pref_sum[i]
将包含A[j]
模数的总和n
,其中 0 <= j <= i
子数组的总和[i, j]
可被n
if整除pref_sum[i] - pref_sum[j - 1] modulo n = 0
。
所以对于i
with pref_sum[i] = x
,我们应该找到 j,其中pref_sum[j - 1] = x
。
如果我们将它存储在哈希表或简单数组中,它可以在 O(1) 中找到。
推荐阅读
- java - DB2 JDBC PreparedStatement 执行错误“Decfloat 转换需要 JDK1.5 null”
- sql - 如果匹配关键字,SQL 返回行
- reactjs - 任何可以编辑标签的 React 标签输入组件?
- nix - 我将我的 nixos 频道更改为不稳定,为什么我的包仍然没有更新?
- php - 当添加新帖子时,laravel 5.6 向 10,000 多个订阅者发送邮件
- c# - 为什么要使用覆盖?
- sql-server - SQL Server 内存中 OLTP (Hekaton) 中的动态更新或等效脚本
- node.js - Angular 6+,能够从应用程序安全地创建用户
- ansible - 来自打包脚本的 Ansible 变量
- php - PHP 从 JSON 数组中获取值