0402-1练习-分治策略-算法导论第三版

4.1-1 所有数组元素为负

解答:所有元素为负数时,FIND—MAXiMUM-SUBARRAY 返回只有一个最小元素的数组和该元素对应的索引。

4.1-4 允许结果为空子数组

假定修改最大子数组问题的定义,允许结果为空子数组,其和为0。你应该如何修改现有的算法,使他们能运行空子数组为最终结果。

解答:判断如果原算法结果为负数,返回空数组。

4.1-5 最大子数组的线性时间算法

使用如下的思想为最子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知 A [ 1 ⋯ j ] A[1\cdots j] A[1j]的最大子数组,基于如下性质将解扩展为 A [ 1 ⋯ j + 1 ] A[1\cdots j+1] A[1j+1]的最大子数组: A [ 1 ⋯ j + 1 ] A[1\cdots j+1] A[1j+1]的最大子数组要么是 A [ 1 ⋯ j ] A[1\cdots j] A[1j]的最大子数组,要么是某个子数组 A [ i ⋯ j + 1 ] ( 1 ≤ i ≤ j + 1 ) A[i\cdots j+1](1\le i\le j+1) A[ij+1](1ij+1)。在已知 A [ 1 ⋯ j ] A[1\cdots j] A[1j]的最大组数组的情况下,可以在线性时间内找出形如 A [ i ⋯ j + 1 ] A[i\cdots j+1] A[ij+1]的最大子数组。

package com.gaogzhen.introductiontoalgorithms3.divideconquer;

import java.util.HashMap;
import java.util.Map;

/**
 * @author gaogzhen
 * @date 2024/5/23 21:05
 */
public class MaxSubarrayIterative {

    public static Map<String, Integer> maxSubarrayIterative(int[] arr) {
        int n = arr.length;
        int maxSum = Integer.MIN_VALUE;
        int sum = Integer.MIN_VALUE;

        int low =0;
        int high = 0;

        int currentLow = 0;
        int currentHigh = 0;
        for (int i = 0; i < n; i++) {
            currentHigh = i;
            if (sum > 0) {
                sum += arr[i];
            } else {
                currentLow = i;
                sum = arr[i];
            }

            if (sum >  maxSum) {
                maxSum = sum;
                low = currentLow;
                high = currentHigh;
            }
        }

        Map<String, Integer> ret = new HashMap<>(3);
        ret.put("low", low);
        ret.put("high", high);
        ret.put("sum", maxSum);
        return ret;
    }


    public static void main(String[] args) {
        int[] arr = {-13, -3, -25, -20, -3, -16, -23, -18, -20, -1, -12, -5, -22, -15, -4, -7};
        Map<String, Integer> map = maxSubarrayIterative(arr);
        System.out.println(map);
    }
}

结语

欢迎小伙伴一起学习交流,需要啥工具或者有啥问题随时联系我。

❓QQ:806797785

⭐️源代码地址:https://gitee.com/gaogzhen/algorithm

[1]算法导论(原书第三版)/(美)科尔曼(Cormen, T.H.)等著;殷建平等译 [M].北京:机械工业出版社,2013.1(2021.1重印).p42

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值