编程的子阵列和最大和膨胀的美(可连接的端到端)

情况1:我不同意端到端

此情况非经常见,方法是动态规划。编程之美的方法三给出了解法。这里就直接给出代码了

int maxSubSum(vector<int>& data)
{
	int length = data.size();
	assert(length >= 0);
	int maxSum = data[length-1],startSum = data[length-1],begin = length-1,i;
	for(i = length-2;i >= 0;i--)
	{
		startSum = max(data[i],data[i]+startSum);//以第i个数开头的最大子数组之和
		if(startSum > maxSum)
		{
			begin = i;
			maxSum = startSum;//当前的最大子数组之和
		}
	}
	startSum = 0;
	for(;begin < length && startSum != maxSum;startSum+=data[begin],begin++)cout << data[begin] << " ";
	cout << endl;
	return maxSum;
}

情形二、数组能够首尾相连

问题的解能够分为两种情况:

1)解没有跨过A[n-1]到A[0]。即普通的求子数组和的最大值

2)解跨过A[n-1]到A[0]

对于第2种情况包括两种可能(2.1)包括整个数组;(2.2)包括两个部分。从A[0]開始的一段以及以A[n-1]结尾的一段,这样的情况相当于从数组A中删除一个和最小的一个子数组,而当最小和为0时,即全为非0元素时,此时又和(2.1)一样。而个人觉得解跨过A[n-1]到A[0]的情况肯定大于没有跨过的情况。所以。最后的结果就是全部元素的和减去绝对值最大的负数子数组,详细代码例如以下:

int maxSubSumEndToEnd(vector<int>& data)
{
	int length = data.size();
	assert(length >= 0);
	int minSum = data[length-1],startSum = data[length-1],allSum = data[length-1],begin = length-1,i,j;
	for(i = length-2;i >= 0;i--)
	{
		allSum += data[i];
		startSum = min(data[i],data[i]+startSum);
		if(startSum < minSum)
		{
			begin = i;
			minSum = startSum;//求绝对值最大的负数子数组
		}
	}
	if(minSum > 0)
	{
		minSum = 0;
		begin = 0;
	}
	startSum = 0;
	j = begin;
	for(;j < length && startSum != minSum;startSum+=data[j],j = (j + 1)%length);//找到開始的位置j
	for(i = j;i != begin;i = (i+1)%length)cout << data[i] << " ";
	cout << endl;
	return (allSum - minSum);
}

如果您有问题,请指正,谢谢

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-02 02:51:09

编程的子阵列和最大和膨胀的美(可连接的端到端)的相关文章

C++中求数组连续子向量的最大和(牛客剑指offer)

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

一维向量中连续子向量的最大和

Q:一个一维向量:arr[n] = {i1,i2,i3,......,in} ,计算其连续子向量中最大和.(即截取连续的一段使得段中各元素和最大,元素有负值:子向量可以为空,即和最小为0) A: 最初的想法是穷举,双层循环将所有连续的元素和算出来 for [i,n){ for[j,n){ caculate sum(arr[j],arr[j]); } } 这种方式虽然有效,但显得很蠢. 这里假设截取的区间是 arr[start, end] ,那么arr[start, end+1]的连续子向量的最大

计算连续子向量的最大和

题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住?(子向量的长度至少是1) package test; import org.junit.Test; public cl

Unity3d之Shader编程:子着色器、通道与标签的写法 &amp; 纹理混合

一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器定义了一个渲染通道的列表,并可选是否为所有通道初始化所需要的通用状态.子着色器的写法如下: Subshader{ [Tags] [CommonState] Passdef [Passdef ...] } 也就是通过可选标签,通用状态 和 一个Pass 定义的列表构成了子着色器. 当Unity选择用于

算法设计--求连续子向量的最大和问题--论想法思路的重要性

向量[31,-41,59,26,-53,58,97,-93,-23,84] 算法一:直接求解,简单粗暴,没有什么想法可言,复杂度是O(N3) // 方法一,接近O(n3) int maxsofar1=0; int count=0; for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { int sum=0; for (int k = i; k < j; ++k) { sum+=vec[k]; count++; } max

581. Shortest Unsorted Continuous Subarray 最短未排序的连续子阵列

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会

public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int sum=0; int res=array[0]; for (int i=0;i<array.length;i++){ sum = sum + array[i]; if(sum>res){ res=sum; } if(sum<0){ sum=0; } } return res; } } 原文地址:https://www.cnblog

网络编程-TCP程序实例(client端heserver端相互通信)

1 package com.yyq; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.InetAddress; 7 import java.net.Socket; 8 9 10 /* 11 * 演示tcp的传输的客户端和服务端的互访 12 * 需求:客户端给服务端发送数据服务端获取信息后给客户端回送数据 13 */ 14 /

求最大和连续子向量问题的算法分析

1 问题描述 这是从<编程珠玑(第 2 版)>的第 8 章"算法设计技术"中看到的一个问题.问题的描述是这样的, "问题的输入是具有 n 个浮点数的向量 x,输出是输入向量的任何连续子向量中的最大和.例如,如果输入向量包含下面 10个元素:(31,-41,59,26,-53,97,-93,-23,84) 那么该程序的输出为x[2...6] 的总和,即 187." 当所有的数都是正数时,问题很容易解决,此时最大的子向量就是输入向量本身.但如果输入向量中含有