【java-算法】连续数组最大和
来源:互联网 发布:小米笔记本 显卡知乎 编辑:程序博客网 时间:2024/06/06 14:12
import java.util.*;/** * HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。 * 今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。 * 但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? * 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。 * 你会不会被他忽悠住?(子向量的长度至少是1) * Created by ZeHua on 2017/5/29. */public class FindGreatestSumOfSubArray { public int FindGreatestSumOfSubArray(int[] array) { if(array==null||array.length==0){ return 0; } if(array.length==1){ return array[0]; } //构建最大和数组 int[] sum = new int[array.length]; for(int i=0,sum_i=0;i<array.length;i++ ){ sum_i=sum_i+array[i]; sum[i]=sum_i; } MaxSumQueue queue = new MaxSumQueue(sum); //开头到末尾的窗口最大值的特殊队列 for(int i=0;i<sum.length;i++){ queue.add(i); } int res; //窗口左端逐步右移,找出子向量的最大和 res = sum[queue.peek()]; if(queue.peek()==0){ queue.poll(); } for(int i=0;i<sum.length-1;i++){ int max = sum[queue.peek()]; int cur = max - sum[i]; if(cur>res){ res=cur; } if(queue.peek()==i+1){ queue.poll(); } } return res; } public static void main(String[] args) { int array[]={1,-2,3,10,-4,7,2,-5}; int max = new FindGreatestSumOfSubArray().FindGreatestSumOfSubArray(array); System.out.println(max); }}//保存窗口最大值的特殊队列class MaxSumQueue{ LinkedList<Integer> queue = new LinkedList<>(); int sum[]; public MaxSumQueue(int[] sum){ this.sum=sum; } public void add(int index){ while(true){ if(queue.isEmpty()){ queue.addLast(index);//下标入队 return; }else{ if(sum[queue.peekLast()]>sum[index]){//比较的是值 queue.addLast(index);//下标入队 return; } } queue.pollLast(); } } public int peek(){ if(queue.isEmpty()){ throw new RuntimeException("队列为空"); } return queue.peekFirst(); } public int poll(){ if(queue.isEmpty()){ throw new RuntimeException("队列为空"); } return queue.pollFirst(); }}
阅读全文
0 0
- 【java-算法】连续数组最大和
- 算法导论 - 最大和连续子数组
- 【算法】最大连续子数组和
- 笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
- 连续子数组的最大和 java
- 算法 | 最大连续子数组
- 分治算法实现最大连续子数组和
- 求连续子数组最大和,两种算法
- 算法题:连续子数组的最大和
- 算法:求连续子数组的最大和
- 算法 (连续)子数组的最大和(及起始点)
- 编程算法 - 连续子数组的最大和 代码(C)
- 面试算法(三十一)连续子数组的最大和
- 编程算法 - 连续和最大的子数组 代码(C)
- [算法]求最大连续子数组和的PHP程序
- 【面试题之算法部分】最大和连续子数组
- 经典算法——连续子数组最大和问题
- 贪心算法解决求数组最大连续和
- RabbitMQ简述
- 关于SVM的一些思考
- 罗永浩跟罗振宇八个半小时都聊了些什么
- 排序算法之堆排序
- (七)Paint 高级渲染
- 【java-算法】连续数组最大和
- 手机拍照银行卡识别银行卡号的技术sdk
- New Era with AlphaGo
- android后台截屏实现(2)--screencap源码修改
- get类型接口测试
- 解决win10系统下软件图标显示异常的问题
- 软件设计的目标
- Mac下eclipse添加hadoop-eclipse-plugin插件
- Camera模组布线规则