算法:管窥算法-零子数组
1.可以用类似 的算法做。
2.一般做法。https://blog.csdn.net/xueyingxue001/article/details/52935547
(注:任何关于子序列的和的都可以用这种思想)
1.计算出前i项和,sum[i],
2.因为“数组A第i到j项的和 = 数组前j项的和sum(j) - 数组前i项的和sum(i-1)”(所以有了前i项我数组sum[],就可以得到A数组的所有子序列了,A的子序列不是sum中的元素就是sum中的任意两个元素相减)
3.所以只需要:把所有子序列一分为二,其中一部分为sum中包含的元素记做 T1集合,另一部分为sum中任意两元素相减的集合记做T2集合。
1,定义S[-1] = 0,对sum[-1, 0,..., N-1]排序后计算相邻元素的差的绝对值(排过序之后,相邻元素的差一定比不相邻的小,所以T2集合中的其他元素是不需要计算和比较了的),记做m1。
2.找出T1集合(即sum)中的元素的绝对值最小的值,记做m2.
3.比较m1和m2,哪个小就是哪个了。
1 /** 2 * 零子算法-要求时间复杂度为nlogn 3 * @param a 4 * @return 5 */ 6 public static int T(int[] a){ 7 //创建sum数组,第i项为a数组的前i项和 8 List<Integer> sum=new ArrayList<>(a.length); 9 sum.add(a[0]); 10 for(int i=1;i<a.length;i++){ 11 sum.add(sum.get(i-1)+a[i]); 12 } 13 // 对sum排序 14 sum.sort(null); 15 //sum中绝对值最小的为m1,sum相邻元素相减绝对值最小的为m2. 16 int m1=Math.abs(sum.get(0)); 17 int m2=Math.abs(sum.get(1)-sum.get(0)); 18 int j=0,k=0; 19 for(int i=1;i<sum.size();i++){ 20 j=Math.abs(sum.get(i)); 21 k=Math.abs(sum.get(i)-sum.get(i-1)); 22 if(j<m1){ 23 m1=j; 24 } 25 if(k<m2){ 26 m2=k; 27 } 28 } 29 return m1<m2?m1:m2; 30 }
转载于:https://www.cnblogs.com/minconding/p/10453847.html
算法:管窥算法-零子数组相关推荐
- 算法学习:后缀数组(SA)
[参考博客] https://xminh.github.io/2018/02/27/%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84-%E6%9C%80%E8%AF%A6%E7 ...
- Java数据结构和算法:字符串、数组和广义表
数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...
- Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)
Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...
- asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- leetcode初级算法4.两个数组的交集 II
leetcode初级算法4.两个数组的交集 II 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] intersect(int[] nums1, in ...
- leetcode初级算法1.删除排序数组中的重复项
leecode初级算法1.删除排序数组中的重复项 仅为个人刷题记录,不提供解题思路 题解与收获 class Solution {public int removeDuplicates(int[] nu ...
- 算法题 如何找到数组中重复的数字
面试题3 数组中重复的数字 题 目 :找出数组中重复的数字. 在一个长度为n的数组里的所有数字都在0 ~ n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- [算法模板]树状数组
[算法模板]树状数组 思路 图片转自:yhf_2015--彻底理解树状数组 使用这个图片就能很快的理解树状数组. 我们可以先根据图片来分解一个十进制数成二次幂. example: \(15=2^0+1 ...
- No.5终于搞懂了kmp算法(精髓为next数组的求解过程,此文next数组未经过优化)
背景 KMP 是经典的字符串匹配算法,在大学课本里面都是讲到过的,不过我感觉课本都讲的太生硬了,很容易忘记.大多数博客也是讲的云里雾里的,一开始就来个公式+部分匹配表,反正我感觉对于没有计算机基础的童 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
最新文章
- 数据结构 - 有两个链表,第一个升序,第二个降序,合并为一个升序链表(C++)
- 【Linux部署】Greenplum数据库6.13.0单机版【重启实录】(5次报错问题及解决的避坑指南+日志文件查看方法)
- oracle 创建nchar类型,nchar类型的用法!
- build.xml编译报错Specified VM install not found: type Standard VM, name jdk1.7.0_45
- LED音乐频谱之点阵
- Docker 架构原理及简单使用
- callable线程池示例_Java Callable Future示例
- 拓端tecdat|r语言ggplot2误差棒图快速指南
- 斐讯盒子T1_【YYF固件】无语音实用版刷机固件及教程分享
- 费率转换成利率的计算器_存款利率计算器
- linux 小度 驱动_小度WiFi怎么安装 小度WiFi驱动安装
- 电脑桌面显示不全设置方法
- 技术与教研并驾齐驱,海风教育如何用模式创新定义教育智能新高度?
- 数据库——关系数据库规范化习题
- 数据可视化-制作交易收盘价
- props写法_详解Vue内部怎样处理props选项的多种写法
- windows c++ (3) windows获取进程PID、进程路径、进程启停及文件相关操作
- Python+Django电影推荐系统搭建
- 英语智能语音测试软件,卓帆英语人机对话智能评测练习软件
- MongoDB基础-张晓飞-专题视频课程
热门文章
- Atitit arch design context软件架构设计的内容 目录 1. 考虑到架构设计原则	1 1.1. 开发效率 稳定性 可靠些等 性能	1 1.2. 简单原则则	1 1.3. 配置
- 目录 1. 常见mime类型	1 1.1. 2.1.1. Type application	2 2.1.2. Type audio 22.1.3. Type image 32.1.4. Type t
- Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M	1 1.2. 二:需要的jar包	1 2. Demo code	2 2.1. WCMapper	2 2.2. WC
- Atitit 补充说明 sql知识图谱与线路图attilax总结补充说明
- atitit.判断时间重叠方法总结 java c++ c#.net js php
- paip.mysql 全文索引查询空白解决
- 生产运维那些事儿-监控篇
- (转)先锋伯格:选择一条少有人走的路,所有的不同由此开始
- 阿里云原生“因云而生”心智大图重磅发布
- 技术人 | 浅谈如何成为技术一号位?