第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)


package chap04_Divide_And_Conquer;

import static org.junit.Assert.*;

import java.util.Arrays;

import org.junit.Test;

/**
* 算反导论第四章 4.1 最大子数组
*
* @author xiaojintao
*
*/
public class Maximum_Subarray_Problem {
/**
* 最大子数组类 left为头部索引,right为尾部索引,sum为数组和
*
* @author xiaojintao
*
*/
protected static class MaxSubarray {
int left;
int right;
long sum;

public MaxSubarray(int left, int right, long sum) {
this.left = left;
this.right = right;
this.sum = sum;
}
}

/**
* 类似减治法,更快速的球最大子数组,支持全部都是负数的数组
*
* @param n
* @return
*/
static MaxSubarray findMaxSubarrayFaster(int[] n) {
long sum = Long.MIN_VALUE;
int right = 0;
int left = 0;
int negativeCounter = 0;
long tempSum = Long.MIN_VALUE;
long tempSum1 = 0;
// 考虑全是负数
for (int i = 0; i < n.length; i++) {
if (n[i] < 0) {
if (tempSum < n[i]) {
tempSum = n[i];
right = i;
}
negativeCounter += 1;
} else if (n[i] >= 0) {
left = i;
break;
}
}
if (negativeCounter == n.length) {
left = right;
return new MaxSubarray(left, right, tempSum);
} else {
for (int j = left; j < n.length; j++) {
tempSum1 += n[j];
if (tempSum1 > sum) {
sum = tempSum1;
right = j;
}
}
sum = Long.MIN_VALUE;
tempSum1 = 0;
int tempLeft = left;
for (int k = right; k >= tempLeft; k--) {
tempSum1 += n[k];
if (tempSum1 > sum) {
sum = tempSum1;
left = k;
}
}
return new MaxSubarray(left, right, sum);
}

}

/**
* 更快的打印最大子数组
*
* @param n
*/
static void printMaxSubarrayFaster(int[] n) {
MaxSubarray maxSubarray = findMaxSubarrayFaster(n);
int[] result = Arrays.copyOfRange(n, maxSubarray.left,
maxSubarray.right + 1);
System.out.println("MaxSubarray is " + Arrays.toString(result) + "from"
+ maxSubarray.left + " to " + maxSubarray.right + ", Sum is "
+ maxSubarray.sum);
}
}

第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法),布布扣,bubuko.com

时间: 2024-10-16 07:06:53

第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)的相关文章

第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)

/** * 最大子数组的暴力求解算法,复杂度为o(n2) * @param n * @return */ static MaxSubarray findMaxSubarraySlower(int[] n) { long tempSum = 0; int left = 0; int right = 0; long sum = Long.MIN_VALUE; for (int i = 0; i < n.length; i++) { for (int j = i; j < n.length; j++

第四章 分治策略 4.1 最大子数组问题 (减治法,别人的,拿来看看)

/** * 获得连续子数组的最大和 * * @author dfeng * */ private static long getMax(long a, long b) { return a > b ? a : b; } /** * 获得连续子数组的最大和 * * @param array * @return 最大和,此处用了Long型是为了表示当参数为null或空时,可以返回null,返回其它任何数字都可能引起歧义. */ public static Long getMax(int[] arra

第四章 分治策略——最大子数组问题

最大子数组问题 方法一:暴力求解方法 我们可以很容易地设计出一个暴力方法来求解本问题:简单地尝试没对可能的子数组,共有O(n2)种 #include<iostream> using namespace std; #define INT_MIN 0x80000000 int main() { int arr[10]={9,8,-3,-5,7,-39,79,-37,8,9}; int i,j; int sum=0,maxsum=INT_MIN; int imax; for(i=0;i<10;

算法导论第四章分治策略编程实践(二)

在上一篇中,通过一个求连续子数组的最大和的例子讲解,想必我们已经大概了然了分治策略和递归式的含义,可能会比较模糊,知道但不能用语言清晰地描述出来.但没关系,我相信通过这篇博文,我们会比较清楚且容易地用自己的话来描述. 通过前面两章的学习,我们已经接触了两个例子:归并排序和子数组最大和.这两个例子都用到了分治策略,通过分析,我们可以得出分治策略的思想:顾名思义,分治是将一个原始问题分解成多个子问题,而子问题的形式和原问题一样,只是规模更小而已,通过子问题的求解,原问题也就自然出来了.总结一下,大致

算法导论 第四章 分治策略

分治策略中,我们递归地求解了一个问题,在每层递归都应用了三步 1.分解,将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小 2.解决,递归地求解出子问题,如果子问题的规模足够小,则停止递归,直接求解 3.合并,把子问题的解给合并为原问题的解 当子问题足够大的时候,需要递归,那就是递归情况 当问题足够小的时候,不需要递归,那就是基本情况 三种求解递归式的方法:代入法 猜测一个界,用数学归纳法来证明这个界 递归树法 将递归式转化为一棵树,其节点表示不同层次的递归调用产生的代价,然后采用边

第四章 分治策略 4.2 矩阵乘法的Strassen算法

package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; /** * 矩阵相乘的算法 * * @author xiaojintao * */ public class MatrixOperation { /** * 普通的矩阵相乘算法,c=a*b.其中,a.b都是n*n的方阵 * * @param a * @param b

第4章 分治策略 monge阵列

#include<iostream> #include<vector> using namespace std; void findOddMin(vector<vector<int>> &a, int m, int n, vector<int> &r) { int len = r.size(); vector<int> tmp; for (int i = 0; i < m; ++i){ int b = 0, e

剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)

二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路:由于是后序遍历,所以数组的最后一个节点是根节点,而且,由于是二叉收索树,所以,前面的数据被分为两部分,右边部分比根节点小,左边比根节点大.左右两边又分别为二叉收索树,因此可以用递归来实现. Java代码: public class IsBinarySearchTree { public boolea

算法导论 第三章 and 第四章 python

第三章 渐进的基本O().... 常用函数 % 和  // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法):猜测一个(靠经验)--数学归纳法 ·2:递归树法:画树p31[第3版中文]p51->递归式--证明 3:主方法: 快速,有些地方不能涉及,递归式不易写出 4.1最大数组问题 分治法: 1.A[low ,mid]  2.A[mid+1, high] 3.包含mid中间(想左和右分别遍历组合找出最大)