package maxZiArray;

import java.util.Arrays;

public class ChildArray {
/*
* 用于发现最大子数组 ——分治策略
* param b[] 需要求解的数组
*
* @param first 数组的开始位置
*
* @param last 数组的结束位置
*
* @return 所求子数组
*/
public static SubArray findMaxChildSubArray(int[] b,int first,int last){
if(first == last){
return new SubArray(first,last,b[first]);
}
else{
int mid = (first + last) / 2;
SubArray subArrayLeft = findMaxChildSubArray(b, first, mid);
SubArray subArrayRight = findMaxChildSubArray(b, mid+1, last);
SubArray subArrayCross = findMaxCrossSubArray(b,first,mid,last);

if(subArrayLeft.getSum() > subArrayRight.getSum() && subArrayLeft.getSum() > subArrayCross.getSum()){
return subArrayLeft;
}

else if(subArrayRight.getSum() > subArrayLeft.getSum() && subArrayRight.getSum() > subArrayCross.getSum()){
return subArrayRight;
}

else{
return subArrayCross;
}
}
}
/*
* 用于求解跨界子数组的最大数组
*
* param b[] 需要求解的数组
*
* @param first 数组的开始位置
*
* @param mid 数组的分开位置
*
* @param last 数组的结束位置
*
* @return 所求子数组
*/
public static SubArray findMaxCrossSubArray(int[] b,int first,int mid,int last){
int leftsum = 0;
int leftindex = mid;
int sum = 0;
for (int i = mid; i >= 0; i--) { //注意边界问题,i是可以取到0的
sum += b[i];
if(sum > leftsum){
leftsum = sum;
leftindex = i;
}
}

int rightsum = 0;
int rightindex = mid+1;
sum = 0;
for (int i = mid + 1; i <= last; i++) { //注意边界问题,i 是可以取到last的,因为加入最后一项是b.length - 1;
sum += b[i];
if(sum > rightsum){
rightsum = sum;
rightindex = i;
}
}

return new SubArray(leftindex, rightindex, leftsum + rightsum);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] b = {3,4,-1,5,-6,9,8,-4,-7,5,-9};
// int[] b = {-4,5,6,6,3,7,3,2,5,6};
//为什么不能添加b.length,而非要添加b.length - 1;是以为在findMaxChildSubArray中当last==first是,无法取到b.length这个下标的值,以为是空,
// 这是会出现超出边界错误!
SubArray subArray = findMaxChildSubArray(b,0,b.length -1);
System.out.println("the orient array id" + Arrays.toString(b));

System.out.println("the max child Array is :");
for (int i = subArray.getLow(); i <= subArray.getHigh(); i++) {
System.out.print(b[i] + " ");

}
System.out.println("");
System.out.println(subArray.getLow() + " "+ subArray.getHigh() +" "+ subArray.getSum() + " " + subArray.getClass());
}

}
/*
* @param low 子数组的开始位置
*
* @param high 子数组的结束位置
*
* @param sum 子数组的和
*/
class SubArray{

private int low;
private int high;
private int sum;

public SubArray(int low, int high, int sum) {
super();
this.low = low;
this.high = high;
this.sum = sum;
}

public int getLow() {
return low;
}

public int getHigh() {
return high;
}

public int getSum() {
return sum;
}

}

转载于:https://www.cnblogs.com/lhj9127/articles/childArray.html

最大子数组 ——算法导论相关推荐

  1. Python:实现max sub array最大子数组算法(附完整源码)

    Python:实现max sub array最大子数组算法 from __future__ import annotations def find_max_sub_array(A, low, high ...

  2. 求最大子数组(贪心算法)

    在<算法导论>中举了买股票和割铁棒的例子来说明动态规划和贪心算法的主体思想. 贪心算法:总是做出在当前看来最好的情况.(不是整体最优的) 1. 问题及答案 先抛出一个问题,类似于<算 ...

  3. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

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

    /*** 最大子数组的暴力求解算法,复杂度为o(n2)* @param n* @return*/static MaxSubarray findMaxSubarraySlower(int[] n) {l ...

  5. 找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素)(算法导论第三版9.3-8)

    找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素) (算法导论第三版9.3-8) 时间复杂度O(lgn) int find_median_two_ordered_arrays(int *ar ...

  6. 最大子数组下标java,【算法】最大子数组

    问题描述:给定一只股票在某段时间内的历史价格变化曲线,找出一个能够实现收益最大化的时间段. 理解:为找出最大化的收益,需要考虑的是在买进和卖出时的价格变化幅度,因此从该股票的每日变化幅度来考虑问题比较 ...

  7. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法

    最大子数组问题 线性时间 by Franziska Hinkelmann 通过Franziska Hinkelmann 我最喜欢的线性时间排序算法 (My Favorite Linear-time S ...

  8. 小白学数据结构——零、算法初步(算法分类及最大子数组小试牛刀)

    1. 为啥要学数据结构? 应用:机器学习,数据挖掘,自然语言处理,密码学,计算机图形学 研究:时空复杂度问题 找工作常用:贪心,分治,动态规划,树,图 2.什么是算法? 把大象装进冰箱分为几步?打开冰 ...

  9. 算法导论:快速找出无序数组中第k小的数

    题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1). ...

最新文章

  1. 【Android 组件化】路由组件 ( 注解处理器调试 )
  2. Jacobi迭代法与Gauss-Seidel迭代法
  3. SVN Error:请求的名称有效并且在数据库中找到,但是它没有相关的正确的数据来被解析...
  4. Android到底何去何从?来自腾讯、阿里、京东、网易、美图等大咖为你揭晓
  5. 《北京作家》·史铁生·维格拉姆
  6. C# partial 关键字的使用
  7. CDI和EJB:在事务成功时发送异步邮件
  8. CSS3伪元素、伪类选择器
  9. 用Apache HttpClient实现URL重定向
  10. use 在php 用法中的总结
  11. UniMelb Comp30022 IT Project (Capstone) - 2.Vuforia in Unity
  12. git提交代码 visual_git/github相关介绍
  13. L3G4200陀螺仪学习
  14. MATLAB linspace函数
  15. c语言中compar的用法,compare的用法知识整理
  16. JAVA利用keytool工具生成.crt和.key文件
  17. 时光机之殇---微博告别信
  18. 【智能零售】解读双11后的新零售趋势
  19. CSS选择器的优先级是怎么定义的?
  20. 1896-2021历届奥运会奖牌动态排序动画(Python数据采集)

热门文章

  1. 【python】踩坑:ImportError: numpy.core.multiarray failed to import
  2. 【图像处理】灰度加权距离变换(GWDT)
  3. 深度模型中的梯度消失和梯度爆炸
  4. 发动机悬置python仿真计算
  5. autohotkey+txt (3)+获得鼠标坐标
  6. idft重建图像 matlab_利用 MATLAB 编程,打开一幅图像,对其进行 DFT 变换,并置其不同区域内的系数为零,进行 IDFT ,观察其输出效果。_学小易找答案...
  7. db2 语句包括不必要的列表_列表推导和生成器表达式的滥用
  8. 在Ubuntu 14 04安装和使用Docker
  9. 关于 UML 模型 Visio的说明
  10. DFB [03] 移植遇到的实际问题 基于某著名平台