最大子数组(最小子数组)

Given an array of integers, find a contiguous subarray which has the largest sum.
Return the sum of the subarray.

给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6

1、暴力 O(n2)

public int maxSubArray(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int maxSum = Integer.MIN_VALUE;
    for(int i=0; i<nums.length; i++){
        int sum = 0; //必须定义在第一个for内部
        for(int j=i; j<nums.length; j++){
            sum += nums[j];
            maxSum = Math.max(maxSum, sum);
        }
    }
    return maxSum;
}

2、贪婪算法

public int maxSubArray(int[] A) {
    if(A==null || A.length==0){
        return 0;
    }
    int maxSum = Integer.MIN_VALUE;
    int sum = 0;
    for(int i=0; i<A.length; i++){
        sum += A[i];
        maxSum = Math.max(maxSum, sum);
        sum = Math.max(sum, 0);//最关键 --sum 为负数时,令sum为0
    }
    return maxSum;
}

3、同方法2一样

public int maxSubArray(int[] nums) {
    int maxsum = Integer.MIN_VALUE;
    int sum = 0;
    for (int i = 0; i < nums.length; i++) {
        if (sum < 0) {
            sum = 0;
        }
        sum += nums[i];
        maxsum = Math.max(maxsum, sum);
    }
    return maxsum;
}

4、动态规划

public int maxSubArray(int[] nums) {
    int max_ending_here = nums[0]; //包括当前位置时候的最大值
    int max_so_far = nums[0]; // 最大值
    for (int i = 1; i < nums.length; i++) {
        max_ending_here = Math.max(nums[i], nums[i] + max_ending_here);
        max_so_far = Math.max(max_so_far, max_ending_here);
    }
    return max_so_far;
}

最小子数组

public int minSubArray(ArrayList<Integer> nums) {
    int min_ending_here = nums.get(0);
    int min_so_far = nums.get(0);
    for (int i=1 ;i< nums.size(); i++){
        min_ending_here = Math.min(nums.get(i),nums.get(i) + min_ending_here);
        min_so_far = Math.min( min_so_far, min_ending_here );
    }
    return min_so_far;
}
时间: 2024-12-11 16:57:13

最大子数组(最小子数组)的相关文章

LintCode Python 简单级题目 最小子数组和、最大子数组和

题目1 最小子数组 描述: 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[1, -1, -2, 1],返回 -3 标签 LintCode 版权所有 子数组 贪心 数组 题目2 最大子数组 描述: 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[?2,2,?3,4,?1,2,1,?5,

求最小子数组之二维篇

一.设计思路 求出该二维数组的所有子数组,先确定一个位置为起点,然后向右下方依次以此起点为始的所有子数组, 图1—顺序求子数组 具体如上图1,顺序求出子数组,然后和max值相比较,若比max值大,则将该子数组和赋给max,并保存其位置,对该子数组的位置,只需要保存其首尾位置即可, 图2—保存子数组位置 如上图2所示,得到了最大子数组和与其位置,输出即可. 二.代码 1 package zishuzu; 2 3 import java.util.*; 4 5 public class zuixia

[容易]最小子数组

题目来源:http://www.lintcode.com/zh-cn/problem/minimum-subarray/ 解法同最大子数组: 令currSum为当前最小子数组的和,minSum为最后要返回的最小子数组的和.a[j]有两种选择,要么放入前面的子数组,要么作为新子数组的第一个元素.如果currSum加上当前元素a[j]后不大于a[j],则令currSum再加上a[j].否则currSum重新赋值为a[j].同时,当currSum < minSum,则更新minSum = currSu

lintcode.44 最小子数组

最小子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google

lintcode 中等题:Minimum Size Subarray 和大于S的最小子数组

题目 和大于S的最小子数组 给定一个由 n 个整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组.如果无解,则返回 -1. 样例 给定数组 [2,3,1,2,4,3] 和 s = 7, 子数组 [4,3] 是该条件下的最小长度子数组. 挑战 如果你已经完成了O(n)时间复杂度的编程,请再试试 O(n log n)时间复杂度. 解题 定义两个指针,slow,fast,以先后速度向右走 fast先找到第一个是的sum>s的值 根据fast和slow计算当前子数组的长度

Windows10系统如何安装Microsoft Visual Studio 2015及最小子数组和求解

一.Windows10系统如何安装Microsoft Visual Studio 2015. 1.首先到Visual Studio官方网站(https://www.visualstudio.com/vs/)或者到我给出的下载衔接上下载各个版本的vs2015,我个人推荐下载Visual Studio Community版本,因为该版本是免费的,而且在功能上对于学习者而言已经足够了. 2.把下载的ISO离线安装镜像使用解压工具解压后,打开文件vs_community.exe后,会弹出窗口提示安装,安

编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

      首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了. 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下 PS[i][j] = A[i][j]+PS[

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

一:题目内容及设计思路 1.题目: 返回一个整数数组中最大数组的和 2.要求: (1)输入一个整数数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)求所有子数组的和的最大值.有球时间复杂度为O(n). 3.设计思路: (1)利用while循环输入各个整数,用getchar()函数判断while循环是否结束,当用户按下回车键时,即getchar()=='\n'时,跳出while循环: (2)记录下循环的次数,即数组长度: (3)调用函数Co

php多维数组化一维数组

一.使用foreach <?php function arr_foreach ($arr) { static $tmp=array(); if (!is_array ($arr)) { return false; } foreach ($arr as $val ) { if (is_array ($val)) { arr_foreach ($val); } else { $tmp[]=$val; } } return $tmp; } $a = array(1,2=>array(3,4=>