A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
       例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

3 个回复

倒序浏览
不知道呀,很多看不懂呀,你是什么基础呀。
回复 使用道具 举报
对数组从左到右相加求和,当和的最小值在最大值左边时,和的最小值到最大值之间的子串即为最大子串;
当和的最小值在最大值的右边时,把数组分成三段:
0~最大值坐标,最大值坐标~最小值坐标,最小值坐标~array.length
这三段中的最大子串就是整个数组的最大子串 。
优点:当数组和的最小值在最大值左边时,计算量比较少(只是求一遍和),速度快。

这是我的想法,不知道有没有更好的算法。
回复 使用道具 举报
   //由于求和要对该数组的所有子集都操作一遍,考虑将子集放入到集合里。
import java.util.*;

           class Test
           {
                   public static void main(String[] args)
                   {
                           //定义一个装整型数组的ArrayList集合,放入数组的所有子集
                           // ArrayList<int[]> al = new ArrayList<int[]>();

                                int[] arr = {1,-2,3,10,-4,7,2,-5};

                                //al = getSubArrays(arr);

                                int maxSum = getMaxSumArray(arr);
                                System.out.println("maxSum = "+maxSum);
                               
                               
                   }

                   /*
                        定义一个功能,找出子数组和的最大值
                   */
                   public static int getMaxSumArray(int[] arr)
                   {
                                //定义一个装整型数组的ArrayList集合,放入数组的所有子集
                            ArrayList<int[]> al = new ArrayList<int[]>();
                                al = getSubArrays(arr);
                                int maxSum = arraySum(al.get(0));
                                for (Iterator<int[]> it = al.iterator();it.hasNext() ; )
                                {
                                        int[] temp = it.next();
                                        if (arraySum(temp)>maxSum)
                                        {
                                                maxSum = arraySum(temp);
                                        }
       
                                }return maxSum;
                   }


                   /*
                        定义一个给数组求和的功能
                   */
                   public static int arraySum(int[] arr)
                   {
                                int sum = 0;
                                for (int x=0;x<arr.length ;x++ )
                                {
                                        sum = sum+arr[x];
                                }return sum;
                   }
                       
                        /*
                         定义一个获取数组所有子集的功能
                        */
                   public static ArrayList<int[]> getSubArrays(int[] arr)
                   {
                           ArrayList<int[]> al = new ArrayList<int[]>();
                          
                                for (int x=0;x<arr.length ;x++ )
                                {
                                        for (int y=0,z=arr.length-x;z!=arr.length+1 ;y++,z++ )
                                        {
                                                int[] temp = Arrays.copyOfRange(arr,y,z);
                                                al.add(temp);

                                        }
                                }return al;
                   }
                  
           }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马