连续子数组的最大乘积及连续子数组的最大和(Java)
1. 子数组的最大和
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如数组:arr[]={1, 2, 3, -2, 4, -3 } 最大子数组为 {1, 2, 3, -2, 4} 和为8。
解法1(时间复杂度O(N * N)空间复杂度O(1))
求出所有的子数组的和,比较选择出最大值。利用双重循环就可以遍历到所有的子数组。
- public static void maxSum1(int arr[]) {
- int max=0,sum;
- for(int i=0;i<arr.length;i++)
- {
- sum=0;
- for(int j=i;j<arr.length;j++)
- {
- //遍历数组的所有子数组,并将子数组的最大和保存在max中。
- sum+=arr[j];
- max=Math.max(max, sum);
- //max保存最大的子数组的和
- }
- }
- System.out.println(max);
- }
解法2(动态规划时间复杂度O(N)空间复杂度O(1))
遍历数组,用 sum 保存子数组的和,当 sum<0 时 将 arr[i] 赋值给 sum,用 max 保存最大值。
- public static void maxSum(int arr[]){
- int max=0,sum=0;
- for(int i=0;i<arr.length;i++)
- {
- if(sum<=0){
- sum=arr[i];
- //如果 sum<0 重新赋值
- } else {
- sum+=arr[i];
- }
- max=Math.max(sum, max);
- //将最大值保存在max中。
- }
- System.out.println(max);
- }
2. 子数组的最大乘积
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如数组:arr[]={1, 2, 3, -2, 4, 3 } 最大子数组为 {4,3} 积为12。
解法1(时间复杂度O(N * N)空间复杂度 O(1))
跟上面求最大子数组的和类似,利用双重循环遍历所有的子数组,求出所有子数组中值最大的。
- public static void maxproduct(int arr[]){
- if(arr==null||arr.length==0)
- return;
- //如果数组为 null 或者长度为0直接返回
- int max=0,product=1;
- //max保存子数组的最大乘积,product 用来保存每一个子数组的积
- for(int i=0;i<arr.length;i++) {
- product=1;
- for(int j=i;j<arr.length;j++){
- product*=arr[j];
- max=Math.max(product, max);
- //max保存最大的子数组乘积
- if(product==0)
- break;
- //如果当前子数组的乘积为0则以当前数组为头的后序数组的积全为0不用求。
- }
- }
- System.out.println(max);
- }
解法2(动态规划 时间复杂度O(N )空间复杂度 O(1))
跟上面求最大子数组的和类似,利用双重循环遍历所有的子数组,求出所有子数组中值最大的。以arr[i] 结尾的最大值可能由前面的以arr[i-1]结尾的 最大 负值,最大正数,和arr[i] 产生。例如数组:{2,-3,-4}以-4结尾的最大值,就是3*2=-6,与-4 相乘产生的。
- public static void maxSubProduct(int arr[]){
- if(arr==null||arr.length==0)
- return ;
- int max=arr[0],min=arr[0],maxend,result=0;
- for(int i=1;i<arr.length;i++) {
- //最大值的来源有三种,如果arr[i]是正数,肯定与前面的最大值相乘得到最大值,
- //如果arr[i]是负数就会与前面的最小值相乘产生最大值。如果前面的为0或者负数,
- //arr[i]本身可能是最大值。
- maxend=Max(max*arr[i],min*arr[i],arr[i]);
- //maxend 保存最大值
- min=Min(max*arr[i], min*arr[i], arr[i]);
- //用于保存最小的负值,为下一个最大值最准备
- max=maxend;
- result=Math.max(result, max);
- }
- System.out.println(result);
- }
- public static int Max(int a,int b,int c)
- {
- //返回 a b c 中的最大值
- a=Math.max(a, b);
- a=Math.max(a, c);
- return a;
- }
- public static int Min(int a,int b,int c)
- {
- //返回 a b c 中的最小值
- a=Math.min(a, b);
- a=Math.min(a, c);
- return a;
- }https://blog.csdn.net/u013309870/article/details/70144135
转自:笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
连续子数组的最大乘积及连续子数组的最大和(Java)的更多相关文章
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...
- 152.Maximum Product Subarray---dp---连续子数组的最大乘积---《编程之美》2.13子数组的最大乘积
题目链接:https://leetcode.com/problems/maximum-product-subarray/description/ 题目大意:给出一串数组,找出连续子数组中乘积最大的子数 ...
- 在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象。你可能没有合适的权限”
在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象.你可能没有合适的权限” 打开组策略管理其它选项提示:找不到指定路径.之前做过的操作:取消域控主机上的共享目录sysvol和 ...
- sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)
转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...
- sql 分组取每组的前n条或每组的n%(百分之n)的数据
sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...
- 剑指Offer:面试题31——连续子数组的最大和(java实现)
问题描述 : 输入一个整数数组,数组里面有正数也有负数.数组中一个或连续几个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路1:常规解法,不知道怎么描述了.. 代码: bo ...
- 连续子数组的最大和 java实现
package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...
- 洛谷-乘积最大-NOIP2000提高组复赛
题目描述 Description 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你 ...
- 查找至少连续出现三次的所有数字/连续3天的日期【LeetCode】
编写一个SQL查询,查找至少连续出现三次的所有数字.+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | ...
随机推荐
- pdf怎么转换成word
在线转换:https://app.xunjiepdf.com/pdf2word
- linux查找历史命令
1.ctr+r 输入搜索关键词 2.&history 3.上箭头翻看
- 解决:Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceMode
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Eric_K1m/article/deta ...
- 目前流行前端几大UI框架排行榜
在前端项目开发过程中,总是会引入一些UI框架,已为方便自己的使用,很多大公司都有自己的一套UI框架,下面就是最近经常使用并且很流行的UI框架. 一.Mint UI 流行指数:★★★★ Mint UI是 ...
- python快速搭建http服务
在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器. 如果python为2.x,则可执行:$ python -m SimpleH ...
- zabbix使用自动发现功能批量监控服务器端口的可用性
使用自动发现脚本批量监控服务器端口的可用性 .编写自动发现脚本 # cat /usr/local/zabbix_agents_3.2.0/scripts/web_site_code_status.sh ...
- 用selenium自动加载浏览器下载图片
上一篇用requests这个库进行图片的批量下载,只所以可以这样做,是因为豆瓣提供的XHR的接口API,而且接口返回的数据类型为json格式,所以使用起来非常的方便,但是有时候我们需要分析html格式 ...
- Pi1-加电
作为理工男,怎么能不折腾?终于等到我4G版的树莓派4. 1.制作系统.新手当然上官网下载官方系统,img文件,写入tf卡.mac下的步骤请见<mac下制作树莓派系统盘>,一步步来就行.思路 ...
- mybatis plus 支持达梦DM 数据库啦
最近由于公司项目需要使用DM数据库,现在就官方源码修改了,完美支持达梦数据库的代码生成器.官方说的v3.0.RELEASE版本支持达梦数据库,不知道说的支持包括支持代码生成器么? 怀着兴奋的心情,兴高 ...
- javascript下載csv檔案
參考自: https://dotblogs.com.tw/shihgogo/2017/05/31/090831 function createCsvFile(){ var fileName = &qu ...