博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求所有子数组的和的最大值
阅读量:4695 次
发布时间:2019-06-09

本文共 1337 字,大约阅读时间需要 4 分钟。

转载自http://blog.csdn.net/adam_wzs/article/details/8518093

// 输入一个整形数组,数组里有正数也有负数。

// 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
// 求所有子数组的和的最大值。要求时间复杂度为O(n)。
public class Test
{
static int[] arr =
{
1, -2, 3, 10, -4, 7, 2, -5
};// 需要求的数组
static int maxIndex = arr.length - 1;// 数组的最大下标

public static void main(String[] args)

{
findMaxArr2();
System.out.println("\n-------------");
findMaxArr3();
}

// 1.三层for循环求解

// 2.二层for循环求解
static void findMaxArr2()
{
int max = arr[0];// 最大值
int sum;// 求和
int startIndex = 0;
int endIndex = 0;
for (int i = 0; i <= maxIndex; i++)
{
sum = 0;
for (int j = i; j <= maxIndex; j++)
{
sum += arr[j];
if (sum > max)
{
max = sum;
startIndex = i;
endIndex = j;
}
}
}
System.out.println("最大值为:" + max);
printArr(startIndex, endIndex);
}

// 3.时间复杂度为n

static void findMaxArr3()
{
int max = arr[0];// 最大值
int sum = 0;// 求和
int startIndex = 0;
int endIndex = 0;
for (int i = 0; i <= maxIndex; i++)
{
if (sum >= 0)
{
sum += arr[i];
}
else
{
sum = arr[i];
startIndex = i;// 最大子数组开始值
}
if (sum > max)
{
max = sum;
endIndex = i;// 最大子数组结束值
}
}
System.out.println("最大值为:" + max);
printArr(startIndex, endIndex);
}

// 根据下标开始结束值,打印数组

static void printArr(int startIndex, int endIndex)
{
for (int i = startIndex; i <= endIndex; i++)
{
System.out.print(arr[i] + " ");
}
}

}

转载于:https://www.cnblogs.com/xiaodeyao/articles/4499481.html

你可能感兴趣的文章
常用加密算法
查看>>
MYSQL培训准备(2):MYSQL自增长陷阱
查看>>
IDEA 创建普通的maven+java Project
查看>>
背包专题练习
查看>>
Python学习笔记(二)
查看>>
T-SQL: Create folders in remote server by sql statement
查看>>
linux SVN安装及配置教程
查看>>
poj1088 滑雪问题 dfs写法
查看>>
C# DataTable.Select()方法,条件中使用类型转换
查看>>
Windows7 Questions
查看>>
数据库迁移工具
查看>>
不使用中间变量交换两个变量的值
查看>>
Mysql导入sql文件
查看>>
大道至简:软件工程实践者的思想——第六章感想 从编程到工程
查看>>
SharePoint 2010版本表
查看>>
【BootStrap】初步教程
查看>>
[bbk4397] 第1集 - 第一章 AMS介绍
查看>>
Track Active Item in Solution Explorer
查看>>
maven内置属性
查看>>
spring Aop2
查看>>