利用分治策略解决最大子序列和问题(代码)(Java)

《算法导论》学习记录

/**
 * 利用 分治策略 解决 最大子数组问题
 */
public class _1MaximumSubarrayProblem {
    public static LHS FIND_MAX_CROSSING_SUBARRAY(int[] A, int low, int mid, int high) { // 处理第三种情况的方法
        int left_sum = Integer.MIN_VALUE;
        int max_left = mid; // 左边界
        int sum = 0;
        for(int i = mid; i >= low; i--) { // 从中点往左找
            sum += A[i];
            if(sum > left_sum) {
                left_sum = sum;
                max_left = i;
            }
        }

        int right_sum = Integer.MIN_VALUE;
        int max_right = mid + 1; // 右边界
        sum = 0;
        for(int j = mid + 1; j <= high; j++) { // 从中点 + 1位往右找
            sum += A[j];
            if(sum > right_sum) {
                right_sum = sum;
                max_right = j;
            }
        }
        return new LHS(max_left, max_right, left_sum + right_sum);
    }

    public static LHS FIND_MAXIMUM_SUBARRAY(int[] A, int low, int high) {
        if(high == low) {
            LHS tmp = new LHS(low, high, A[low]);
            return tmp;
        }

        int mid = (low + high) / 2;
        LHS Left_Tmp = FIND_MAXIMUM_SUBARRAY(A, low, mid);  // 第一种情况,全在左边
        LHS Right_Tmp = FIND_MAXIMUM_SUBARRAY(A, mid + 1, high); // 第二种情况,全在右边
        LHS Cross_Tmp = FIND_MAX_CROSSING_SUBARRAY(A, low, mid, high); // 第三种情况,横跨中点

        if(Left_Tmp.sum >= Right_Tmp.sum && Left_Tmp.sum >= Cross_Tmp.sum) {
            return Left_Tmp;
        }
        else if(Right_Tmp.sum >= Left_Tmp.sum && Right_Tmp.sum >= Cross_Tmp.sum) {
            return Right_Tmp;
        }
        else {
            return Cross_Tmp;
        }
    }

    public static void main(String[] args) {
        int[] A = new int[]{ -1, -2, -3, -4 };
        LHS ans = FIND_MAXIMUM_SUBARRAY(A, 0, A.length - 1);
        // 如果A数组全负,则返回最大的负数
        System.out.printf("left:%d right:%d sum:%d\n", ans.low, ans.high, ans.sum);
    }
}

class LHS { // 用于记录在某一段区间的和
    public int low; // 左边界
    public int high; // 右边界
    public int sum; // 区间A[low..high]的总和

    public LHS(int l, int h, int s) {
        low = l;
        high = h;
        sum = s;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
26牛牛不会梦到感谢信:羡慕离职了还能吃吗现在就赶回去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14064次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6309次浏览 98人参与
# 水滴春招 #
16219次浏览 339人参与
# 入职第四天,心情怎么样 #
11265次浏览 63人参与
# 租房找室友 #
7997次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26139次浏览 356人参与
# 职场新人生存指南 #
199165次浏览 5506人参与
# 参加完秋招的机械人,还参加春招吗? #
26960次浏览 276人参与
# 文科生还参加今年的春招吗 #
4101次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48608次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155712次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44261次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103638次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20517次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46662次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901179次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81368次浏览 496人参与
# 国企还是互联网,你怎么选? #
109188次浏览 853人参与
牛客网
牛客企业服务