返回一个整数数组中最大子数组的和2

简介: 一、实验要求:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

一、实验要求:

输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
结对编程要求:
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)

二、实验思路:

  1. 联系思考如果不是循环数组的话,一个普通的数组,求他们的连续的最大子数组的和的最大值,应该怎么实现,例如:1,2,3,4,5 如果是一个循环数组,那么其中的3,可以组成的数组最大就不是3,4,5,而是3,4,5,1,2
  2. 循环数组从那个数开始,那么相当于在那个数的位置切开,他的最大子数组,就是和他相邻的但是断开后不相邻的那个位置,例如从4开始,和4相邻的是3和5,当截断后可以看成是一个普通数组4,5,1,2,3,其中的3就是和他相邻但是截断后不相邻的数
  3. 如果想求这个数组,我们可以把这个数组扩展一下,如1,2,3,4,5我们可以扩展成1,2,3,4,5,1,2,3,4 ,也就是在最后一个数的后面再加上他前面的数,然后我们在取最长的子数组的时候,可以按照第二个新构建的数组,从其中取连续的五个,这个是满足要求的数组

三、团队成员:曾凯   王志伟

四、开发照片:

 

  

五、实验代码:

package demo3;
public class Route {
    public static void main(String[]args)
    {
        int a[]={1,2,3,4,5,6};
        int b1[] = new int[2*a.length-1];
        for(int i=0;i<a.length;i++)
        {
            b1[i]=a[i];
        }
        for(int i=a.length;i<2*a.length-1;i++)
        {
            b1[i] = a[i-a.length];
        }
        int b[]=panduan(a);
        System.out.print("最大子数组是:");
        for(int i=b[1];i<=b[2];i++)
        {
            System.out.print(b1[i]+"  ");
        }
        System.out.println("\n最大值是:"+b[0]);
    } 
    static int[] panduan(int[] a)
    {
        int b[] = new int[2*a.length-1];
        for(int i=0;i<a.length;i++)
        {
            b[i]=a[i];
        }
        for(int i=a.length;i<2*a.length-1;i++)
        {
            b[i] = a[i-a.length];
        }
        int [][]a1= new int[b.length][b.length];
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                a1[i][j]=0;
            }
        }
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                if(j==i)
                {
                    a1[i][j]=b[j];
                }
                else
                {
                    
                    a1[i][j]+=b[j]+a1[i][j-1];
                }
            }
        }
        int max=a1[0][0];
        int i1=0;
        int j1=0;
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                if(max<a1[i][j])
                {
                    max=a1[i][j];
                    i1=i;
                    j1=j;
                }
            }
        }
        int a2[]=new int[3];
        a2[0]=max;
        a2[1]=i1;
        a2[2]=j1;
        return a2;
    }
}

六、结果截图:

 

七、实验总结:

  通过这次两人团队的协助编程,其中我主要负责代码测试部分,代码编程部分由另一名组员完成,经过大概一个多小时的讨论和编码,最终完成。开始的时候,主要是讨论两个人对本题的思路,然后动笔在纸上写了一个数组,然后按照普通的数组,先想普通数组求这个最大子数组的和,应该如何实现,接着通过交流两个人的对算法的理解,最后实现了这个功能。

  通过这次实验,我也增加了团队沟通和协助能力。

 

目录
相关文章
|
7月前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
7月前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
存储 索引
信息学奥赛 如何在整数数组中寻找两数之和等于给定目标值
本文介绍了在整数数组中寻找两个数之和等于给定目标值的问题,提供了两种解法:暴力法和哈希表法。通过比较两种解法的时间复杂度,指出了哈希表法更为高效。
123 0
|
7月前
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
43 0
剑指offer 57. 数组中数值和下标相等的元素
剑指offer 57. 数组中数值和下标相等的元素
107 0
剑指offer 57. 数组中数值和下标相等的元素
|
搜索推荐
每日一题——两数之和(返回下标和返回数值两种情况)
每日一题——两数之和(返回下标和返回数值两种情况)
|
数据处理
整数数组中最大子数组的和(2)—— 处理二维数组
将二维转化为一维处理,当子矩阵的上下行确定时,把上下行中每一列的数据当作一个单元,确定左右列的过程就是求以列为单元的一维数组的子数组最大和的过程,这种方法大大提高了效率
94 0
整数数组中最大子数组的和(2)—— 处理二维数组
|
Java
求整数数组中最大子数组的和(1)
绝大部分同学都已经做出来了单维数组的 求数组中最大子数组的和, 但是你不妨试一试:把你的程序编译为可执行文件, 然后执行 例如 maxsum.exe 输出就是最大子数组的和, 上面的例子就应该输出 16.
114 0
求整数数组中最大子数组的和(1)
|
算法 Java C#
数组中数字出现的个数(剑指offer 56-I)
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
|
机器学习/深度学习 存储 算法
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素