当前位置: 首页 > news >正文

算法-最大子数组

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

在给定的一个数组中,求解收益最大化。只可以操作一次。
只可操作一次,就需要确保数组是连续的。

整体架构流程

使用分治策略的求解法:
假定我们寻找子数组A[low,high]的最大子数组。使用分治技术意味着我们需要将子数组划分为两个规模尽量相等的子数组。找到子数组的中央位置mid=(low+high)/2。然后求解两个子数组A[low,mid]和A[mid+1,high]。A[low,high]的任何连续子数组A[i,j]所处位置必然是以下三中情况之一:

  1. 完全位于左子数组A[low,mid]中,因此low<=i<=j<=mid。
  2. 完全位于右子数组A[mid+1,high]中,因此mid+1<=i<=j<=hight。
  3. 跨越中间点,因此low<=i<=j<=hight。

技术细节

public class MaxSubArray {static class MaxVo {//最小索引值public int lowIndex;//最大索引值public int highIndex;//在low至high的最大值public int maxSum;public MaxVo(int lowIndex, int highIndex, int maxSum){this.lowIndex = lowIndex;this.highIndex = highIndex;this.maxSum = maxSum;}@Overridepublic String toString() {return "MaxVo{" +"lowIndex=" + lowIndex +", highIndex=" + highIndex +", maxSum=" + maxSum +'}';}}public static void main(String... args){int[] arr = {13,3,9,-5,1};MaxVo maxVo = findMaxSubArray(arr,0, arr.length-1);System.out.println(maxVo.toString());}/*** 递归* @param arr 数组* @param low 下标* @param high 上标* @return 最大子数组*/private static MaxVo findMaxSubArray(int[] arr, int low, int high){if(low == high){//最小递归的数据return new MaxVo(low,high,arr[low]);}else {int mid = (low + high)/2;//左边的最大子数组MaxVo lowVo = findMaxSubArray(arr,low,mid);//右边的最大子数组MaxVo highVo = findMaxSubArray(arr,mid+1, high);//左右合并的最大子数组MaxVo crossVo = findMaxCrossingSubArray(arr,low,mid,high);//返回low至high的最大子数组if(lowVo.maxSum >= highVo.maxSum && lowVo.maxSum >= crossVo.maxSum){return lowVo;} else if (highVo.maxSum >= lowVo.maxSum && highVo.maxSum >= crossVo.maxSum) {return highVo;}else {return crossVo;}}}/*** 发现合并的两个,最大子数组* @param arr 数组* @param low 最小索引* @param mid 中间索引* @param high 最大索引* @return low至high的最大子数组*/private static MaxVo findMaxCrossingSubArray(int[] arr, int low, int mid, int high){int lowSum = 0;int lowIndex = mid;int sum = 0;//获取左边最大子数组//获取左边数组累计最大值,和最小的索引位置for(int i = mid; i >= low; i--){sum+= arr[i];if(sum > lowSum){lowSum = sum;lowIndex = i;}}int highSum = 0;int highIndex = mid + 1;sum = 0;//获取右边最大子数组//获取右边数组累计最大值,和最小的索引位置for(int i = mid+1; i <= high; i++){sum += arr[i];if(sum > highSum){highSum = sum;highIndex = i;}}return new MaxVo(lowIndex,highIndex,lowSum+highSum);}
}

小结

求解到的是一个最大的子数组,而不是最大子数组,因最大子数组有可能有多个。

http://www.lqws.cn/news/535663.html

相关文章:

  • 【Python】For
  • Agentic AI爆发前夜,合作伙伴如何把握时代机遇?
  • 2D写实交互数字人如何重塑服务体验?
  • MP1652GTF-Z:MPS高效3A降压转换器 工业5G通信专用
  • windows内核句柄判断有效
  • LeetCode刷题-top100(和为 K 的子数组)
  • ISP Pipeline(4): Anti Aliasing Noise Filter 抗锯齿与降噪滤波器
  • 【thinkphp5】Session和Cache记录微信accesstoken
  • QT实现一个三轴位移台的控制界面
  • QT Creator构建失败:-1: error: Unknown module(s) in QT: serialport
  • 【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)
  • 【缓存技术】深入分析如果使用好缓存及注意事项
  • Flux.create
  • Linux 内核 TCP 的核心引擎:tcp_input.c 与 tcp_output.c 的协同之道
  • ubuntu安装docker遇到权限问题
  • TCP 重传机制详解:原理、变体与故障排查应用
  • 利用python和libredwg库解析dwg格式文件输出GeoJSON
  • Mac电脑如何搭建基于java后端的开发的各种工具服务
  • 自动获取文件的内存大小怎么设置?批量获取文件名和内存大小到Excel中的方法
  • IDEA下载不了插件了怎么办?从本地导入插件详细教程!
  • ubuntu 远程桌面 xrdp + frp
  • 【工具推荐】WaybackLister——发现潜在目录列表
  • OpenBayes 一周速览丨Nanonets-OCR-s深度语义理解,精准结构化转换;HLE人类问题推理基准上线,含2.5k题目,助力封闭式评估体系构建
  • 环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
  • 基于SpringBoot和Leaflet的区域冲突可视化-以伊以冲突为例
  • 【Pytorch】语言模型上的动态量化
  • 供应链管理:主要生产计划类型及其相关信息
  • Solidity学习 - 认识Solidity合约结构
  • GitLab 18.1 发布 Runner、无效的个人访问令牌查看等功能,可升级体验!
  • 一分钟了解Transformer