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


    情况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);
    }

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

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

  • 相关阅读:
    Java构造和解析Json数据的两种方法详解一
    使用json-lib进行Java和JSON之间的转换
    java 读取文件转换成字符串
    Jackson 框架,轻易转换JSON
    (转载)最黑的黑客米特尼克:多次耍FBI 终被高手擒
    (转载)Linux下IPTABLES防火墙的设定
    (转载)Linux下IPTABLES配置详解
    (转载)Linux上iptables防火墙的基本应用教程
    (转载)更好的重启nginx 服务器
    (转载)JavaScript中的Window窗口对象
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4823489.html
Copyright © 2020-2023  润新知