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;
}
java基础算法(一):最大子序列和问题的多种算法思路的更多相关文章
- Java基础常用类深度解析(包含常见排序算法)
目录 一.工具类 1.1.工具类的设计 1.1.1.公共静态方法 1.2.单例模式 二.包装类 2.1.基本类型的包装类 2.1.1.Integer 2.1.1.1.Integer >> ...
- 一、Java基础--01
Java基础测试题分析 第一题是关于基本的算法知识,这个很有必要去掌握以下,在学校也经常听老师们说找工作比试面试会出一些这方面的知识,我拿到的第一题是关于排序的,虽然很简单,但是我还是要提醒一下基础不 ...
- Java基础知识-去重
java基础知识-去掉list集合中的重复元素: 思路: 首先新建一个容器resultList用来存放去重之后的元素 然后遍历sourceList集合中的元素 判断所遍历的元素是否已经存在于resul ...
- 算法入门:最大子序列和的四种算法(Java)
最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...
- Java基础算法集50题
最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...
- Java基础:JVM垃圾回收算法
众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- Java基础-使用JAVA代码剖析MD5算法实现过程
Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 阿里P7整理“硬核”面试文档:Java基础+数据库+算法+框架技术等
现在的程序员越来越多,大部分的程序员都想着自己能够进入大厂工作,但每个人的能力都是有差距的,所以并不是人人都能跨进BATJ.即使如此,但身在职场的我们一刻也不能懈怠,既然对BATJ好奇,那么就要朝这个 ...
随机推荐
- 牛客训练赛55 E 树
很妙的一个树形DP问题,简单考虑了一下就过了 https://ac.nowcoder.com/acm/contest/2927/E 主要就是推公式(公式有点长呀) 大概就是这样,其实挺简单的. #in ...
- windows下PostgreSQL 安装与配置
下载地址 https://www.postgresql.org/download/ Download the installer certified by EnterpriseDB for all s ...
- Vue-cli2.0
本文的学习来自技术胖大神的教程:https://jspang.com/ Vue-cli是vue官方出品的快速构建单页应用的脚手架 开发一个项目,在开始的时候,会构建项目结构.webpack.怎么运行. ...
- nginx优势,依赖,启动
Nginx Nginx优势1.nginx将网络,磁盘及定时器等异步事件的驱动都做了非常好的封装,基于它开发将可以忽略这些事件处理的细节.2.Nginx封装了许多平台无关的接口,容器,适用于跨平台开 ...
- Vue.js项目在apache服务器部署后,刷新404的问题
原因是vue-router 使用了路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面. const router = n ...
- docker+mysql 构建数据库的主从复制
docker+mysql 构建数据库的主从复制 在最近的项目中,决定将项目改造成数据库读写分离的架构,后续会有博文详细讲述我的开发改造,本文主要记录我是如何一步步的构建数据库的主从复制. 为什么使用d ...
- LinkedHashMap与HashMap的使用比较
现在由于项目需要,使用了LinkedHashMap,一开始由于很少用到Map,然后就直接使用了HashMap,在将数据成功存入之后取出来就出了问题,数据输出顺序没有按预期顺序输出,现在先看代码: 文件 ...
- 原生js中call、apply、bind的区别和相同点
结论: 相同点: 1.都是js原生方法,改变函数中的this指向 2.都可以传递参数,第一个参数为 把this指向到哪里去,即目标元素 不同点: 1.call和apply都是主动触发,绑定后自动执行, ...
- python——pickle模块的详解
pickle模块详解 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反 ...
- 微信小程序点击图片放大
WXML: <view class='imgList'> <view class='imgList-li' wx:for='{{imgArr}}'> <image cla ...