元素之和最接近 0 的区间(部分和)
来源:互联网 发布:奶奶抱走红网络 编辑:程序博客网 时间:2024/06/02 05:29
也即有以正数和负数组成的数组 A[] 时,求数组中区间之和最接近 0 的区间。
- A[i]:-14, 7, 2, 3, -8, 4, -6, 8, 9, 11(i=0~9)
A[] 中并没有区间和等于 0 的区间,但有与 0 最接近的区间 A[2] ~ A[5],其区间和为 1。找出这种区间的一种方法是,也是最直观的想法,搜索所有区间并计算个区间的和,通过比较求出最小值。显然这种方法对于具有 N 个元素的数组,会达到 O(N^2) 的区间。
利用部分和可以降低时间复杂度。使用区间和就能把区间 A[i] ~ A[j] 的和表示为如下形式:
上面公式的结果接近 0,就意味着 psum[] 的差值最小。为了在给定数组中找出最接近的两个元素,需要先对数组排序(O(N logN)),然后再确认两个相邻的元素(O(N))。此时算法的时间复杂度为 O(N logN)。
vector<int> partialSum(const vector<int>& A) { vector<int> ret(A.size()); ret[0] = A[0]; for (int i = 1; i < A.size(); ++i) { ret[i] = A[i] + ret[i - 1]; } return ret;}void solve(const vector<int>& A) { vector<int> psum = partialSum(A); vector<int> tmp = psum; int minVal = 987654321, v1, v2; sort(tmp.begin(), tmp.end()); for (int i = 1; i < tmp.size(); ++i) { if (minVal > tmp[i] - tmp[i - 1]){ minVal = tmp[i] - tmp[i - 1]; v1 = tmp[i - 1]; v2 = tmp[i]; } } int a, b; for (int i = 0; i < psum.size(); ++i) { if (psum[i] == v1) a = i; if (psum[i] == v2) b = i; } cout << a+1 << " " << b << endl; // a+1 的原因在于, 这里的 tmp[i] - tmp[i-1] 其实是开区间,而题目要求的其实是闭区间}
0 0
- 元素之和最接近 0 的区间(部分和)
- 最接近的三数之和
- 最接近的三数之和
- 求无序数组中三个元素相加与目标数最接近的三元素之和
- 子向量之和最接近0?
- 查找最接近的元素
- 查找最接近的元素
- 查找最接近的元素
- 找出升序数组中元素之和最接近于给定数值的两个数
- [LeetCode]16 最接近的三者之和
- LintCode:最接近的三数之和
- LintCode 52-最接近的三数之和
- LintCode 59 最接近的三数之和
- 最接近的三数之和 _LintCode
- C++之求取vector中三个元素和和给定元素最接近的值(15)---《那些奇怪的算法》
- OpenJudge_P7940 查找最接近的元素
- 01:查找最接近的元素
- 【lintcode】两数之和、三数之和、最接近的三数之和、四数之和小结
- Uva 455 Periodic Strings
- fedora 安装网易云音乐成功却无法启动的问题
- STC单片机控制BH1750测量光照强度程序
- C语言 将一个整形数字二进制位进行奇偶交换
- 解决TortoiseGit每次Pull或者Push都需要输用户名密码问题
- 元素之和最接近 0 的区间(部分和)
- SVN分支和合并(trunk、branches、tags)
- eclipse maven 导出项目依赖的jar包
- LeetCode 135 Candy (贪心 构造)
- cocos2d-x-2.1.4 在安卓平台编译
- java--Struts2的There is no Action mapped for namespace错误
- Sicily1133: SPAM (电子邮箱匹配)
- PRVF-0002 : 无法检索本地节点名
- Laravel 5.2 自增id问题