每日一题2023.8.23|Leetcode918.环形数组的最大和

做环形数组最大和之前先做一下数组最大和

53.数组最大和

题目链接:LeetCode53.数组最大和
本体使用动态规划或者贪心

动态规划

class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int>dp(nums.size(),0);dp[0]=nums[0];int ans=nums[0];for(int i=1;i<nums.size();++i) {int num = dp[i-1]+nums[i];if(num>nums[i]) dp[i]=num;else dp[i]=nums[i];ans =ans>dp[i]?ans:dp[i];}return ans;}
};

贪心

class Solution {
public:int maxSubArray(vector<int>& nums) {int sum=nums[0];int ans = nums[0];for(int i=1;i<nums.size();++i){sum+=nums[i];if(sum<=nums[i]) sum=nums[i];ans = ans>sum?ans:sum;}return ans;}
};

918.环形数组的最大和

题目链接:LeetCode918环形数组的最大和

动态规划

求解普通数组的最大子数组和是求解环形数组的最大子数组和问题的子集。设数组长度为n,下标从0开始,在环形数组中,答案可能包括以下两种情况:

  1. 构成最大子数组和的子数组为nums[i:j],包括nums[i]到nums[j-1]共j-i个元素,其中0<i<j<=n
  2. 构成最大子数组和的子数组为nums[0:i]和nums[j:n]其中0<i<j<n
    第二种情况中,答案可以分为两部分,nums[0:i]为数组的某一前缀,nums[j:n]为数组的某一后缀。求解时,可以枚举j,固定sum(nums[j:n])的值,然后找到右端点坐标范围在[0,j-1]的最大前缀和,将它们相加更新答案。
class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();vector<int>leftmax(n,0);//记录数组的前缀最大子数组和,下标从0开始leftmax[0]=nums[0];int sum=nums[0];//用来记录普通数组的子数组的和int res=nums[0];//普通数组的最大子数组和int leftsum=nums[0];for(int i=1;i<n;++i){sum+=nums[i];if(sum<=nums[i]) sum=nums[i];res = res>sum?res:sum;leftsum+=nums[i];leftmax[i]=leftmax[i-1]>leftsum?leftmax[i-1]:leftsum;}if(res<0) return res;//数组中的元素都是负数//固定后缀int rightsum=0;for(int i=n-1;i>0;--i){rightsum+=nums[i];res = max(res,leftmax[i-1]+rightsum);}return res;}
};

取反

对于第二种情况,可以找到普通数组最小的子数组nums[i-j]。令maxRes是普通数组的最大子数组和,minRes是普通数组的最小子数组和,可以将maxRes与sum(nums[0-n])-minRes取最大值作为答案。

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int sum=nums[0];//求解数组的和int summax=nums[0],maxres=nums[0];//最大子数组和int summin=nums[0],minres=nums[0];//最小子数组和for(int i=1;i<nums.size();++i){summax = max(summax+nums[i],nums[i]);maxres = max(maxres,summax);summin = min(summin+nums[i],nums[i]);minres = min(minres,summin);sum+=nums[i];}//cout<<maxres<<" "<<minres<<" "<<sum;if(maxres<0) return maxres;return max(maxres,sum-minres);}
};

单调队列

可以将数组延长一倍,即对于i>=n的元素,令nums[i]=nums[i-n]
对于第二种情况,nums[0:i]和nums[j:n]可以组成连续的一段,因此问题转换为一个在长度为2n的数组上寻找长度不超过n的最大子数组和(每个位置的元素只能使用一遍)。令si为前i项的前缀和,找到最大的si-sj其中i-n<=j<i,用单调队列维护该集合

  1. 遍历到i时,单调队列头部元素下标小于i-n,则出队。该过程一直进行,直至队列为空或者队头下标大于等于i-n
  2. 取队头元素作为j,计算si-sj更新答案
  3. 若队列尾部元素k满足sk>=si则出队,该过程一直进行,直至队列为空或者条件不满足因为k<i,k更容易被步骤1剔除,并且作为被减项,sk比si更大,更不具有优势。
class Solution {
public:typedef pair<int,int> pa;//位置到前缀和的映射int maxSubarraySumCircular(vector<int>& nums) {int sum=nums[0],res=nums[0];int n = nums.size();deque<pa> qu;qu.push_back(pa(0,sum));for(int i=1;i<2*n;++i){sum+=nums[i%n];while(!qu.empty()&&qu.front().first<i-n) {qu.pop_front();}res = max(res,sum-qu.front().second);while(!qu.empty()&&qu.back().second>=sum){qu.pop_back();}qu.push_back(pa(i,sum));}return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不用循环数组,js+html实现贪吃蛇

功能描述&#xff1a;每走10步随机改变一个方方向&#xff0c;当键盘按下方向键 w,s,a,d时&#xff0c;使用键盘方向控制蛇的移动&#xff0c;蛇头每撞到一次自身时改变屏幕颜色&#xff0c;蛇头碰到边界时从另一边回来。 实现思路&#xff1a;用个30大小的数组存放每个结点&a…

mysql 表的约束

目录 mysql 表的约束 NULL/NOT NULL DEFAULT comment zerofill PRIMARY KRY 删除主键 添加主键 复合主键 AUTO_INCREMENT UNIQUE KEY FOREIGN KEY mysql 表的约束 约束是 mysql 为了保证数据正确的一种手段&#xff0c;而前面在谈数据类型的时候&#xff0c;数据类…

【C语言】喝汽水问题

大家好&#xff01;今天我们来学习C语言中的喝汽水问题&#xff01; 目录 1. 题目内容&#xff1a; 2. 思路分析 2.1 方法一 2.2 方法二 2.3 方法三 3. 代码实现 3.1 方法一 3.2 方法二 3.3 方法三 1. 题目内容 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以…

Spring复习:(59)@Qualifier注解

Qualifier注解用来指定自动注入时合作bean需要满足的qualifier的名称&#xff0c;如果一个bean没有指定qualifier属性&#xff0c;则用它的id为qualifier&#xff0c;来给别的bean提供注入。 示例 package cn.edu.tju.domain;public class MovieCatalog { }package cn.edu.tju…

fastadmin后台表格新增tab选项卡不生效问题

官方一张图解析表格列表功能文档&#xff1a;(一张图解析FastAdmin中的表格列表的功能 - FastAdmin问答社区) 会遇到后期手动添加tab栏的情况 首先&#xff0c;需要在控制器对应的index.html页面中需要增加你想要筛选的字段 <div class"panel-heading">{:bui…

Gitlab服务部署及应用

第四阶段 时 间&#xff1a;2023年8月21日 参加人&#xff1a;全班人员 内 容&#xff1a; Gitlab服务部署及应用 目录 一、Gitlab简介 二、Gitlab工作原理 三、Gitlab服务构成 四、Gitlab的优点 五、Gitlab环境部署 &#xff08;一&#xff09;安装部署 &#xf…

ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …

Django REST framework实现api接口

drf 是Django REST framework的简称&#xff0c;drf 是基于django的一个api 接口实现框架&#xff0c;REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …

java.8 - java -overrideoverload 重写和重载

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不…

多种编程语言运行速度排名-10亿次除7求余数为0的数量

最佳方式是运行10次&#xff0c;取平均数&#xff0c;用时秒数显示3位小数。 因为第一次打开&#xff0c;可能CPU还没优化好&#xff0c;多次取平均&#xff0c;比较准确 第1次共10次&#xff0c;用时3秒&#xff0c;平均3秒 第2次共10次&#xff0c;用时4秒&#xff0c;平均3.…

代码随想录第六十天

代码随想录第六十天 Leetcode 84. 柱状图中最大的矩形 Leetcode 84. 柱状图中最大的矩形 题目链接: 柱状图中最大的矩形 自己的思路:没想到&#xff01;&#xff01; 正确思路:和接雨水类似&#xff0c;只是需要左右补0&#xff01;&#xff01;&#xff01; 代码: class S…

4.17 如何基于 UDP 协议实现可靠传输?

目录 QUIC 是如何实现可靠传输的&#xff1f; Packet Header QUIC Frame Header QUIC 是如何解决 TCP 队头阻塞问题的&#xff1f; 什么是TCP对头阻塞问题&#xff1a; HTTP/2 的队头阻塞: 没有队头阻塞的 QUIC QUIC 是如何做流量控制的&#xff1f; QUIC 实现流量控制…

Android JNI修改ByteArray参数并返回

在JNI中修改ByteArray类型的参数并返回&#xff1a; 添加native方法 class TestLib {companion object{init {System.loadLibrary("jnitest")}}external fun modifyByteArray(data:ByteArray):ByteArray } var data byteArrayOf(1,2,3,4,5,6) Log.i(TAG,"in …

RK3399 开机自启一个shell脚本,一直起不来BUG

开机自启shell脚本如下&#xff1a; diff --git a/device/rockchip/common/sepolicy/file_contexts b/device/rockchip/common/sepolicy/file_contexts index eb6b5e4bb4..0bbe781a7c 100755 --- a/device/rockchip/common/sepolicy/file_contextsb/device/rockchip/common/se…

Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据

效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…

Git gui教程---番外篇 gitignore 的文件使用

想说的 .gitignore 的文件一般大型的编译器带git的都会生成&#xff0c;他可以将你不想提交的文件在git下忽略掉&#xff0c;你应该不想将一大堆编译生成的过程文件&#xff0c;还有一些贼大的文件提交上git的。 凡是都有例外&#xff0c;一些冥顽不灵的编辑器&#xff0c;只能…

screen

可以参考博客&#xff1a;https://blog.csdn.net/nima_zhang_b/article/details/82797928 Linux中的screen是一个命令行工具&#xff0c;可以让用户在同一个终端会话中创建多个虚拟终端。它非常有用&#xff0c;因为它允许用户在后台运行长时间的进程**&#xff0c;即使用户断…

使用Pytorch和OpenCV实现视频人脸替换

“DeepFaceLab”项目已经发布了很长时间了&#xff0c;作为研究的目的&#xff0c;本文将介绍他的原理&#xff0c;并使用Pytorch和OpenCV创建一个简化版本。 本文将分成3个部分&#xff0c;第一部分从两个视频中提取人脸并构建标准人脸数据集。第二部分使用数据集与神经网络一…

(学习笔记-调度算法)内存页面置换算法

在了解内存页面置换算法前&#xff0c;我们得先了解 缺页异常&#xff08;缺页中断&#xff09;。 当 CPU 访问的页面不在物理内存中时&#xff0c;便会产生一个缺页中断&#xff0c;请求操作系统将缺页调入到物理内存。那它与一般的中断主要区别在于: 缺页中断在指令执行 [期…

共享内存 windows和linux

服务端&#xff0c;即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…