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

918. 环形子数组的最大和

https://leetcode.cn/problems/maximum-sum-circular-subarray/description/?envType=study-plan-v2&envId=top-interview-150

思路:相比于非环情况,环状的难点是没法找到初始情况,所以就没办法往下推,但是环状的答案分布也有两种,一种是跨越环的分布,另一种是不跨越的(这种情况就是和非环的是一样的),对于跨越的情况可以将环分为两部分(因为数组的和是不变的,所以想找到和最大的子数组和那么对应另一部分肯定就是最小子数组和,最大子数组和(跨越),最小子数组和(不跨越)),所以只要找到不跨越的最小子数组和就行。

上面的最大子数组和和最小子数组和我们都可以通过kadane算法求出(不知道的可以去了解一下,当然用动态规划也是可以的)

class Solution {public int maxSubarraySumCircular(int[] nums) {int n = nums.length;// 采用Kadane算法,计算非环情况的最大子数组和和最小子数组和int currMax = nums[0], currMin = nums[0], sum = nums[0];int globalMax = nums[0], globalMin = nums[0];for(int i = 1; i < n; i++) {currMax = Math.max(nums[i], currMax + nums[i]);currMin = Math.min(nums[i], currMin + nums[i]);globalMax = Math.max(globalMax, currMax);globalMin = Math.min(globalMin, currMin);sum += nums[i];}int ans = 0;// 如果最小子数组和等于整个数组和,说明所有元素都是负数,那么最大子数组和就是全局最大值if(globalMin == sum) {ans = globalMax;return ans;}// 不跨越和跨越的情况里选出较大值ans = Math.max(globalMax, sum - globalMin);return ans;}public static void main(String[] args) {Solution solution = new Solution();int[] nums = {1,-2,3,-2};int ans = solution.maxSubarraySumCircular(nums);System.out.println(ans);}
}

http://www.xdnf.cn/news/9064.html

相关文章:

  • 消费电子卷入“技术军备竞赛”
  • shell脚本基础
  • 记忆上传与自我同一性的哲学-技术综合分析
  • AI日报 - 2025年05月26日
  • 快速了解GO之Channel 通道
  • uv ——新的python包管理工具
  • 如何在 ONLYOFFICE 演示文稿中调整段落首行缩进
  • 第10章 网络与信息安全基础知识
  • 【分治】数组中的逆序对
  • 格恩朗管段超声波流量计:流量测量先锋
  • SD-WAN与传统网络结合:轨道交通网络优化的高效实践与深度解析
  • Day37打卡 @浙大疏锦行
  • 数据库入门:以商品订单系统为例
  • Nuxt.js vs Next.js:Vue 与 React 阵营的 SSR 双雄对比
  • python25-递归算法
  • 人工智能第一币AISPF,首发BitMart交易所
  • P5734 【深基6.例6】文字处理软件
  • Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化
  • Lines of Thought in Large Language Models
  • (10)-java+ selenium->元素之By class name
  • window 显示驱动开发-Direct3D 呈现性能改进(一)
  • P1068 [NOIP 2009 普及组] 分数线划定
  • 机试 | STL | string | 文字处理软件
  • linux 进程间通信_共享内存
  • Python打卡第37天
  • 数据结构基础知识补充
  • leetcode刷题日记——求根节点到叶节点数字之和
  • Python数据分析基础(一)
  • vue3自定义指令来实现 v-lazyImg 功能
  • IP地址查询的重要性