最大连续子数组和最大、最小,绝对值最大、最小

连续子数组最大和,可考虑

public class Solution {
    public int maxSubArray(int[] nums) {
        int len=nums.length;
        if(nums==null || len==0)return 0;
        int MAX=nums[0];
        int curSum=nums[0];
        for(int i=1;i<len;i++){
            if(curSum>0){
                curSum+=nums[i];
            }else{
                curSum=nums[i];
            }
            MAX=Math.max(curSum,MAX);
        }
        return MAX;
    }
}

连续子数组绝对值最大,可考虑

//求子数组的和的绝对值的最大值
//先计算所有sum[0-j] 0<= j <n,然后对sum[0-j]的数组进行排序,那么对于任何i,j段的和等于:sum[i-j]= sum[0-j] - sum[0-i];
//设置数组sum用来存储子数组0-j的和
//因为已经对sum进行了排序,排序后只需要找到sum[sum.size()-1]-sum[0],sum[z]  (0<=z<sum.size())的绝对值的最大值即可。z为排序后的索引
//如果是sum[z]情形,z为排序后的索引,则maxAbs = abs(sum[0-i])
//如果是sum[sum.size()-1]-sum[0]情形,则maxAbs = abs(sum[i]-sum[j])
//时间复杂度:o(nlogn) 空间复杂度:o(n)
public int maxAbsSum2(int[] num)
{
	if(num.length()==0) return 0;
	if(num.length()==1) return Math.abs(num[0]);
	int max_abs_sum;
	int[] sum = new int[num.length()];
	int cur_sum = 0;
	for(int i=0; i<num.length(); i++)
	{
		cur_sum += num[i];
		if(cur_sum == 0)
			return 0;
		sum[i] = cur_sum;
	}
	Arrays.sort(sum);
	max_abs_sum = Math.abs(sum[sum.length()-1]-sum[0]);
	for(int i=0; i<sum.length(); i++)
	{
		cur_sum = Math.abs(sum[i]);
		if(cur_sum>max_abs_sum)
			max_abs_sum = cur_sum;
	}
	return max_abs_sum;
}
时间: 2024-10-11 18:22:52

最大连续子数组和最大、最小,绝对值最大、最小的相关文章

连续子数组的和的最大值、最小值以及和的绝对值的最大值、最小值

#include <iostream> #include <vector> #include <algorithm> using namespace std; //求子数组的最小和 //利用的是dp的思想,依次遍历数组中的每个元素,把他们相加,如果加起来大于0,则 //把当前元素之和清为0,否则则和最小和比较,更新最小和,最后得到必是子数组的最小和 //时间复杂度:o(n) 空间复杂度:o(1) int minSum(vector<int> &num

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

23:最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 简单题.... function GetLeastNumbers_Solution(input, k) { if(k>input.length) return []; let ans = []; input = input.sort(); //console.log(input.join("").slice(0,4).split

lintcode循环数组之连续子数组求和

v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. v 样例 给定 [3, 1, -100, -3, 4], 返回 [4,0]. v 思路 1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间.从左边开始一直累加,并初始当前区间[ld

【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 

【剑指Offer学习】【面试题31:连续子数组的最大和】

题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 例子说明: 例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}.因此输出为该子数组的和18 . 解题思路: 解法一:举例分析数组的规律. 我们试着从头到尾逐个累加示例数组中的每个数字.初始化和为0.第一步加上第一个数字1, 此时和为1.接下来第二步加上数字-2,和就变成了-1.第三步

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

连续子数组的最大和问题及其变化

输入一个整型数组,数组中有正数也有负数.数组中的一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 如输入{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},输出应该是18 这是在<剑指offer>上看到的题目,这道题可以在O(n)的时间复杂度内求解,而且这个问题可以是很多更加复杂问题的子问题.所以记录加深下印象. 分析: 以上面列出的{1,-2,3,10,-4,7,2,-5}来分析,可以这么想,从头开始遍历,当前面某几项的和是负数,需要舍弃前面

剑指offer系列源码-最大子向量和(连续子数组的最大和)

题目1372:最大子向量和(连续子数组的最大和) 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2169解决:570 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)

求连续子数组的最大和

一.题目: 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8. 二.解法: 解法一:暴力求解法 /* (1) 常规方法,时间复杂度O(n*n) (2) 先从第一个元素开始向后