给定一个整数数组,找到一个具有最大和的子数组,返回其最大和

/**
     * 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
     * 样例
     * 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6
     * 
     * 分析:子数组是指原数组中连续的一组数。求最大值,如果数组中元素都小于0;则直接返回数组的最大值。对于一般的情况。我们只要遍历求数组,

           同时对其求和,如果和数变得小于0,那就说明了此时这个子数组是不符合题意的,如果和数为正且大于之前求和过程中记录的最大值,那就将这个

           和数赋值给MAX,这样遍历一趟就将其中的最大和给求出来了。
     *
     * @param args
     */

 

 

import java.util.ArrayList;
import java.util.List;

public class Snippet {
	
	/***
	 * @desc 
	 * 方法一:暴力枚举 
		定义一个最大值max初始化一个很小的数,定义一个变量sum表示求和值,遍历数组元素,从第一个元素开始,依次相加,
		如果和sum比最大值max大就将sum赋值给最大值。然后再来一个循环控制从第i个数组元素开始求和,直到n. 
		时间复杂度:O(n^2)
	 * @param params
	 * @return
	 */
	public static List<Integer> subArraySumItem(int[] params) {
	    int currentSum = 0;
	    int curStart = 0;
	    int maxSum = 0;
	    int start = 0;
	    int end = 0;
	    for (int i = 0; i < params.length; i++) {
	        currentSum += params[i];
	        if(currentSum > 0) {
	            if (currentSum > maxSum) {
	                maxSum = currentSum;
	                start = curStart ;
	                end = i;
	            }
	        }else{
	            currentSum = 0;
	            curStart = i ;//i=2
	            
	        }
	    }
	    List<Integer> list = new ArrayList<Integer>();
	    for (int i = start+1; i <=end ; i++) {
	        list.add(params[i]);
	    }
	    return list;
	}
	
	
	
	
	private static int getMaxSum(int[] arr) {
        int max = -100000;
        for (int i = 0; i < arr.length; i++) {
            int sum = 0;
            for (int j = i; j < arr.length; j++) {
                sum += arr[j];
                if (max < sum) {
                    max = sum;
                }
            }
        }

        return max;
    }
	
	/**
	 * 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
	 * 样例
	 * 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6
	 * 
	 * 分析:子数组是指原数组中连续的一组数。求最大值,如果数组中元素都小于0;则直接返回数组的最大值。对于一般的情况。我们只要遍历求数组,

	       同时对其求和,如果和数变得小于0,那就说明了此时这个子数组是不符合题意的,如果和数为正且大于之前求和过程中记录的最大值,那就将这个

	       和数赋值给MAX,这样遍历一趟就将其中的最大和给求出来了。
	 *
	 * @param args
	 */
	public static void main(String[] args) {
	    int[] arrays = new int[]{-2, 2, -3, 4, -1, 2, 1, -5, 3};
	   
	    /*List<Integer> list = subArraySumItem(arrays);
	    System.out.println("list=" + list);*/
	    
        int maxSum = getMaxSum(arrays);
        System.out.println("最大子数组的和为:" + maxSum);
	    
	    /*System.out.println("dd->" + getMaxSum2(arrays));*/
	  
	}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值