java基础算法(一):最大子序列和问题的多种算法思路
时间:2019-10-15
本文章向大家介绍java基础算法(一):最大子序列和问题的多种算法思路,主要包括java基础算法(一):最大子序列和问题的多种算法思路使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题:
/**
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列。
* 示例:
* 输入: [-2,1,-3,4,-1,2,1,-5,4],
* 输出: 6,并打印连续子序列
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*/
测试main方法:
public static void main(String[] args) { int[] data={1,-2,3,4,-8,12,2}; System.out.println(subSequenceSum01(data)); System.out.println(subSequenceSum02(data)); }
算法一
//算法一: 穷举遍历,比较找出最大的 private static Integer subSequenceSum01(int[] array){ int maxNum=0; Map<Integer, List<Integer>> subSequence=new HashMap<>(); for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { int thisNum=0; List<Integer> list=new LinkedList<>();//保存子序列 // i: 子序列开始下标 j:结束下标 for (int k = i; k <= j; k++){ thisNum+=array[k]; //每一次计算里循环子序列和 list.add(array[k]); } if(thisNum>maxNum){ maxNum=thisNum; subSequence.put(maxNum,list);//每一次最大值和对应子序列 } } } // Arrays.toString 数组转换字符串 System.out.println("算法一:"+Arrays.toString(subSequence.get(maxNum).toArray())); return maxNum; }
算法二
//算法二, 改进算法一,不需要计算每一次子序列和,采用累加方式,一步步找出最大值 private static Integer subSequenceSum02(int[] array){ int maxNum=0; Map<Integer, List<Integer>> subSequence=new HashMap<>(); for (int i = 0; i < array.length; i++) { int thisNum=0; List<Integer> list=new LinkedList<>();//保存子序列 for (int j = i; j < array.length; j++) { thisNum+=array[j]; //子序列值累加,从开始累加到结尾计算出最大值 list.add(array[j]); if(thisNum>maxNum){ maxNum=thisNum; List<Integer> subList = new ArrayList<>();//每次都需要一个新集合,否则值会变 subList.addAll(list); subSequence.put(maxNum,subList);//每一次最大值和对应子序列 } } } System.out.println("算法二:"+Arrays.toString(subSequence.get(maxNum).toArray())); return maxNum; }
原文地址:https://www.cnblogs.com/houzheng/p/11681711.html
- Oracle运算符收录(易忘记,但是又很重要的运算符)
- Case When ELSE END语句
- oracle 表空间tablespace
- Oracle Schema
- Oracle 索引
- Oracle dbms_random随机函数包
- volatile和Synchronized区别
- Oracle 快速插入1000万条数据的实现方式
- HashMap实现原理分析
- Oracle TM锁和TX锁
- Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)
- select for update和select for update wait和select for update nowait的区别
- Android入门之动画
- Java 读写大文本文件
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【python opencv】霍夫变换
- python动态柱状图图表可视化:历年软科中国大学排行
- 【MSQL数据库】MySQL中的NULL
- sklearn自带的数据集以及生成数据
- elaticserch的索引
- 有效地读取图像,对比opencv、PIL、turbojpeg、lmdb、tfrecords
- 消息队列的使用(kafka举例)
- 类加载过程,双亲委派模型?
- 图卷积网络-多标签分类
- MySQL parttion分区,以及分区和分表的区别
- ThreadPoolExcutor源码分析
- 动态分组卷积-Dynamic Group Convolution for Accelerating Convolutional Neural Networks
- (15)Shell概述及脚本执行方式
- jvm线上内存问题排查
- (18)Bash输入输出重定向