查找数组连成环形的和最大的连续子数组

 1 package zuoYe;
 2
 3 import java.util.Scanner;
 4
 5
 6 public class MaxSubArray {
 7     public static void main(String[] args) {
 8         Scanner scan = new Scanner(System.in);
 9
10
11         //输入数据
12         System.out.println("请输入数组长度");
13         int n = scan.nextInt();
14         int[] a = new int[n];
15
16         System.out.println("请输入数组元素");
17         for(int i = 0;i < n;i++)
18         {
19             a[i] = scan.nextInt();
20         }
21         scan.close();
22         //计算此数组的和最大的连续子数组
23         int[] result = maxSub(a,a.length);
24         System.out.println("不连接成环的和最大的连续子数组:");
25         for(int i = result[0];i <= result[1];i++)
26         {
27             System.out.print(a[i] + "\t");
28         }
29         System.out.println("和为:" + result[2]);
30
31
32
33
34         //将此数组连成一个环,再计算此数组的和最大的连续子数组
35         //连成一个环即将数组后再接上此数组,但是数组的最后一个元素不用接,相当于计算接上之后的数组的和最大子数组
36         int[] b = new int[2 * n - 1];
37         for(int i = 0;i < n - 1;i++)
38         {
39             b[i] = a[i];
40             b[n + i] = a[i];
41         }
42         b[n - 1] = a[n - 1];
43         int[] result2 = maxSub(b,n);
44         System.out.println("\n\n将数组连成环后的和最大的连续子数组:");
45         for(int i = result2[0];i <= result2[1];i++)
46         {
47             System.out.print(b[i] + "\t");
48         }
49         System.out.println("和为:" + result2[2]);
50
51
52     }
53
54
55
56
57     //计算a数组的和最大的连续子数组(a数组为连成环后的等价数组,即原数组的二倍,n为原数组的长度)
58     public static int[] maxSub(int[] a,int n)
59     {
60         int an = a.length;//连成环的等价数组的长度
61         int currectSum = a[0];//记录当前累加和,初始值为a[0]
62         int currectStartIndex = 0;//记录当前累加的起始下标,初始值为0
63         int count = 1;//记录累加元素的个数,初始值为1
64         int[] result = new int[3];//记录结果子数组的信息,
65         result[0] = 0;//结果子数组的开始下标
66         result[1] = 0;//结果子数组的结束下标
67         result[2] = a[0];//结果子数组的和
68         for(int i = 1;i < an;i++)//依次遍历a数组的每个元素
69         {
70             if(currectSum <= 0)//如果当前累加和不大于0,不大于0对后续的元素没有贡献,可以去掉了,所以应从a[i]处重新开始加
71             {
72                 currectSum = a[i];//将当前累加和赋值为a[i]
73                 currectStartIndex = i;//将当前累加的开始下标赋值为i
74                 count = 1;//将累加元素的个数记为1
75             }
76             else//当前累加和大于0,则继续加a[i]
77             {
78                 currectSum += a[i];
79                 count++;//当前累加元素的个数加一
80             }
81             if(currectSum > result[2])//如果当前累加和大于原结果数组的累加和result[2],则应该将结果子数组信息更新为当前子数组,因为当前子数组的累加和大于结果子数组的和
82             {
83                 result[0] = currectStartIndex;//结果子数组的开始下标为当前子数组的开始下标
84                 result[1] = i;//结果子数组的结束下标赋值为i
85                 result[2] = currectSum;//结果子数组的累加和赋值为当前子数组的累加和
86             }
87             if(count >= n)//如果累加的元素个数等于原数组(未连成环的数组)的长度,则说明已经加了最多的元素,不能再加了,也就是说和最大的子数组即为原数组,应该结束循环
88             {
89                 break;
90             }
91         }
92         return result;
93     }
94
95
96
97 }
时间: 2024-08-25 15:13:44

查找数组连成环形的和最大的连续子数组的相关文章

查找环形数组的和最大的连续子数组

设计思想: 把一个数组连成环,查找这个环的和最大的连续子数组时走到原来的数组尾部可以再继续加第一个元素,所以等价于构建一个原来数组2倍的数组 查找和最大的连续子数组方法: 设原先数组两倍的数组名为a,长度为2n - 1,原数组长度为n 定义一个当前的总和currectSum,初始值为a[0];定义一个当前总和的开始加和的位置下标currectStartIndex,初始值为0:定义一个记录连续加了多少个数的变量count,初始值为1.定义一个长度为3的结果数组result,用来存放最终找到的和最大

求二维数组中子数组和中最大的值,及子数组

求二维数组中子数组和中最大的值,及子数组 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 每次着急写程序,碰到问题就头疼,头疼之后便是满满的收获,付出总有回报. 题目 求

[LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E

算法 | 最大连续子数组

最大连续子数组 给定一个数组A[0,1,-,n-1],求A的连续子数组,使得该子数组的和最大. 例如: 数组:1,-2,3,10,-4,7,2,-5 最大字数组:3,10,-4,7,2 此问题有以下四种方法 1.  暴力法 2.  分治法 3.  分析法 4.  动态规划法 暴力法 直接求解A[I,-j]的值,其中,0<=i<n,i<=j<n,因为i,i+1,-j的最大长度为n,所以时间复杂度O(n3). //暴力法 int MaxSubArray(int *a, int n) {

算法学习笔记:最大连续子数组

寻找最大连续子数组 这两天看了看数据结构与算法,对其中一个问题颇感兴趣,所以在这里写一下.问题:寻找最大连续子数组. 问题:在一个有正有负的数组中,寻找一个连续的.和最大的子数组.这个数组类似于下面的数组,否则这个问题没有意义(如果全是正数的话,所有数组元素的和一定是最大的,同样全为负数也没有意义.). int a={1,-2,3,45,-78,34,-2,6}; 解法一:暴力求解. 那么如何来解决这个问题呢?这个思路要起来并不难,绝大多数人会想到这样的办法:遍历该数组的所有子数组,找到和最大的

Leetcode 581.最短无序连续子数组

最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序. 说明 : 输入的数组长度范围在 [1, 10,000]. 输入的数组可能包含重复元素 ,所以升序的意思是<=. 题目给了我们一个nums array,

LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. LeetCode581. Shortest Unsorted Continuous Subarray 示例 1: 输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8,

(算法)和为0的最大连续子数组

题目: 和为零的最大连续子数组 思路: 我首先想到的是前缀数组和,遍历一遍数组,计算出sum[i](表示从0-i的子数组之和). 有了前缀数组和,只要sum[i]=sum[j](i<j),那么区间[i+1,j]就是和为零的子数组,只要在遍历前缀数组和时记录最长的区间即可. 需要注意的是:当sum[i]等于0时,其区间为[0,i]. 在判断sum[i]=sum[j](i<j)时,有个查找的过程,要么直接遍历j左边的所有数(增加时间复杂度),要么通过map来存储对应和的下标位置(空间换时间).(详

找出一个整数数组的和最大的连续子数组

题目: 给任意一个整数数组,找出这个数组的和最大的连续子数组(子数组的和最大且子数组连续).要求:算法的时间复杂度为O(n). 程序设计思想: 1:用maxValue记录当前连续子数组和为最大的和的值,初始化其值为:maxValue=a[0].注:记数组为a[n]. 2:这个过程总的思想就是,从数组头开始往后,每次加进一个值,它们的和记为tempValue,若tempValue比新加进来的数值本身要小,应该从这个位置开始重新开始计算tempValue的值.而每次的tempValue都应该和max