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)的更多相关文章

  1. 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

    Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...

  2. 152.Maximum Product Subarray---dp---连续子数组的最大乘积---《编程之美》2.13子数组的最大乘积

    题目链接:https://leetcode.com/problems/maximum-product-subarray/description/ 题目大意:给出一串数组,找出连续子数组中乘积最大的子数 ...

  3. 在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象。你可能没有合适的权限”

    在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象.你可能没有合适的权限” 打开组策略管理其它选项提示:找不到指定路径.之前做过的操作:取消域控主机上的共享目录sysvol和 ...

  4. sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)

    转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...

  5. sql 分组取每组的前n条或每组的n%(百分之n)的数据

    sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...

  6. 剑指Offer:面试题31——连续子数组的最大和(java实现)

    问题描述 : 输入一个整数数组,数组里面有正数也有负数.数组中一个或连续几个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路1:常规解法,不知道怎么描述了.. 代码: bo ...

  7. 连续子数组的最大和 java实现

    package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...

  8. 洛谷-乘积最大-NOIP2000提高组复赛

    题目描述 Description 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你 ...

  9. 查找至少连续出现三次的所有数字/连续3天的日期【LeetCode】

    编写一个SQL查询,查找至少连续出现三次的所有数字.+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | ...

随机推荐

  1. 探索ENCODE数据库 | Encyclopedia of DNA Elements

    ENCODE: Encyclopedia of DNA Elements 目标:按不同组织,收集人类(还有小鼠.worm.fly)基因组里面的所有功能元件 The primary goal of th ...

  2. 引用fastclick.js或使用触屏监听 滑动屏幕报错:解决[Intervention] Unable to preventDefault inside passive event listener

    使用fastClick.js所产生的一些问题 开发h5活动页时想到移动端会有300ms的延迟,于是便打算用fastClick.js解决. 页面引入fastClick.js后,滑动H5页面的时候发现谷歌 ...

  3. Python开源项目Top30

    原文地址:https://www.cnblogs.com/stoker/p/9101825.html No 1:Home-assistant (v0.6+) 基于Python 3的开源家庭自动化平台[ ...

  4. Nodejs 包与 npm第三方模块安装和 package.json 以及 cnpm

    包与 NPM 1. 包 Nodejs 中除了它自己提供的核心模块外,可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依 赖关系的模块进行统一管理. ...

  5. Dart入门

    要学Flutter必先学Dart,Dart和Java的语法很像,学过Java的人很快就能入手 Dart下载地址https://dart.dev/get-dart VSCode下载地址https://c ...

  6. [No000019A]IDEA 设置手册

    [No000019A]idea设置手册.rar IDEA 设置手册 IDEA 设置手册 plugin lgnore files and folesrs 代码管控 程序框架 部署方式 useless 3 ...

  7. C++11 并发编程库

    C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...

  8. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  9. linux 下mysql 关闭 启动

    一. 启动 .使用 service 启动:service mysql start .使用 mysqld 脚本启动:/etc/init.d/mysql start .使用 safe_mysqld 启动: ...

  10. 量化编程技术—itertools寻找最优参数

    # -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: ''' 在量化数据处理中,经常使用itertools来完成数据的各种排列组合以寻找最优 ...