表现良好的最长时段[前缀和思想子数组]

news2024/9/30 9:31:46

前缀和与最长子数组

  • 前言
  • 一、表现良好的最长时间段
  • 二、前缀和思想&子数组
    • 1、前缀和&map
    • 2、前缀和&单调栈
  • 总结
  • 参考文献

前言

对于子数组/子串问题,紧密连续前缀和/滑动窗口/单调栈;挖掘内在规律,可以简化代码,降低时空复杂度或消耗量。

一、表现良好的最长时间段

在这里插入图片描述

二、前缀和思想&子数组

1、前缀和&map

抽象一下工作时长,工作时长不重要,重要的是两种类型,用1/-1标记两种类型,问题就转换成了求和为正数的最长子数组。
采用前缀和思想,用map记录前面前缀和,重复的只记最前面(为了最长子数组),为了让和为正数,当sum < 0时,查阅map中是否存在(sum - 1)即可。

class Solution {
    public int longestWPI(int[] hours) {
        // 由于只有1和-1,不可能前缀和出现跳跃的情况,所有hashMap就可以处理。
        // TreeMap<Integer,Integer> tm = new TreeMap<>();
        Map<Integer,Integer> fx = new HashMap<>();
        for(int i = 0;i < hours.length;i++){
            hours[i] = hours[i] > 8 ? 1:-1;
        }
        int sum = 0;
        int max = 0;
        for(int i = 0;i < hours.length;i++){
            sum += hours[i];
            // 记录最大长度
            if(sum > 0) max = i + 1;
            else if(fx.containsKey(sum - 1)){
                max = Math.max(max,-fx.get(sum - 1) + i);
            }
            // 为了最长子数组,只记录最前面的前缀和。
            if(!fx.containsKey(sum)) fx.put(sum,i);
        }
        return max;
    }
}
// 总结:对于连续子数组问题,多半前缀和/滑动窗口/单调栈
// 1-如何确定连续时间段?两层for循环暴力确定?以结果向导的前缀和确定!!!
// 2-如何确定该连续时间段有效?根据map中记录的前缀和确定。

2、前缀和&单调栈

前缀和子数组[l , r]有如下特点,
当prfix[r] > prefix[l]时,则该子数组是有效数组,当prefix[l1] < prefix[l2],那么l2作为左边界是无意义的,毕竟l2可以,则l1也可以,而且还更长,所以记录一下单调减序列即可。
注:这里的单调栈和传统的单调栈不同,不是整个数组的单调栈,没有出栈操作。
再反向遍历前缀和数组,和栈中元素比较,不断出栈寻找prefix[r] > min(prefix[l]),再记录最长数组长度。
这里出栈元素是对接下来的r没有影响的,证明如下,
当r1 > r 2时,则l1 > l2,两个数组存在包含关系,没有影响。
当r1 < r2时,则l1 < l2,按照单调栈规则,l1一定在l2上面,所以出栈l1是没任何影响的。

// 单调栈
func longestWPI(hours []int) int {
    // 问题转换,求和大于0的最长子数组;
    updateHours(hours)
    // 记录前缀和
    prefix := recordPrefix(hours)
    // 得到单调减栈
    stack,top := getStack(prefix)
    //fmt.Println(prefix)
    //fmt.Println(stack)
    // 寻找最大子数组
    i := len(prefix) - 1
    m := 0
    for ; i > 0;i-- {
        // 剪枝,一旦prefix>0,即前面的子数组最大良好就是本身。
        if prefix[i] > 0 {
            return max(m,i)
        }
        k := i
        for ; top > 0 && prefix[stack[top - 1]] < prefix[i] ; {
            top--
            k = stack[top]
        }
        m = max(m,i - k)
    }
    return m
} 
func getStack(prefix []int)([]int,int){
    stack := make([]int,0)
    top := 0
    for i := 1;i < len(prefix);i++ {
        if top == 0 || prefix[stack[top - 1]] > prefix[i] {
            stack = append(stack[:top],i)
            top++
        } 
    }
    return stack,top
}
func recordPrefix(hours []int)[]int{
    prefix := make([]int,len(hours) + 1)
    for i,h := range hours {
        prefix[i + 1] = prefix[i] + h 
    }
    return prefix
}
func updateHours(hours []int) {
    for i := 0;i < len(hours);i++ {
        if hours[i] > 8 {
            hours[i] = 1
        }else {
            hours[i] = -1
        }
    }
}
func max(x,y int) int {
    if x > y {
        return x
    }
    return y
}

总结

1)对于子数组/子串问题,紧密连续前缀和/滑动窗口/单调栈。
2)挖掘内在规律,可以简化代码,降低时空复杂度或消耗量。比如这里单调栈,将前缀和简化;比如这里不用TreeMap排序,数值只有1/0/-1三种可能,前缀和必定连续。

参考文献

[1] LeetCode 表现良好的最长时段
[2] LeetCode 官方题解

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

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

相关文章

Python多进程同步——文件锁

多个进程共享同一份资源&#xff08;共享内存、文件等&#xff09;时&#xff0c;会涉及到资源竞争问题。为了解决这种问题&#xff0c;一般采取的措施是进程在访问资源前加锁保护&#xff0c;避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。 目录…

天荒地老修仙功-第六部第二篇:Spring Cloud Eureka自我保护机制

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%&#xff0c;如果低于 85%&#xff0c;Eureka Server 会将这些实例保护起来&#xff0c;让这些实例不会过期&#xff0c;但是在保护期内如果服务刚好这个服务提供者非正常下线了&#xff0c;此时服务消…

[SCTF2019]babyre 题解

对未来的真正慷慨&#xff0c;是把一切献给现在。 ——加缪 目录 1.查壳 2.处理花指令&#xff0c;找到main函数 这一操作过程可以参考下面的视频&#xff1a; 3.静态分析第一部分,psword1 4.静态分析第二部分,psword2 5.静态分析第五部分&#xff0c;psword3 6.根据ps…

国产Linux操作系统读写RFID、NFC、IC卡示例源码

Windows系统应该是我们接触最多、最为熟悉的电脑端操作系统。Windows操作系统只能安装在x86指令集的CPU电脑中&#xff0c;x64是x86的升级版&#xff0c;Intel、Amd是x86指令集CPU最大的2个生产商。Windows系统下&#xff0c;外设接口驱动一般都封装成DLL动态库内&#xff0c;通…

基于springboot开发众筹平台前后台管理系统【完整源码+数据库+运行指导】

一、项目简介 本项目是一套基于springboot开发众筹平台前后台管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…

2023csoj寒假训练10

csoj寒假训练10 A 并查集 两个黑球之间距离不够这个白球通过的话&#xff0c;视为一个集合 考虑怎样维护这样两两之间的关系&#xff0c;我们使用并查集 同时黑球与直线的关系也要做一次维护 最后可以直接判断是否上下两条直线是否在一个集合里面 如果在一个集合里面说明…

Spring容器演示——采用Spring配置文件管理Bean

一、创建Maven项目 创建Maven项目 - SpringDemo&#xff0c;设置项目位置以及组ID 修改项目的Maven配置 二、添加Spring依赖 在Maven仓库里查找Spring框架&#xff08;https://mvnrepository.com&#xff09; 查看Spring Core 选择版本 - 5.3.25 添加到pom.xml文件的元…

盘点程序员都不一定知道的小众网站!建议收藏,java编程必备!

俗话说的好&#xff0c;有一个趁手的工具解决了80%的疑虑。作为智慧物种的新新人类&#xff0c;手上掌握一两个不为人知的好用网站已经是件稀疏平常的事情。 今天我们就一起来看看&#xff0c;有哪些小众网站是程序员必备的&#xff01; 业内人士都知道&#xff0c;一直劈里啪…

windows下面安装Python和pip终极教程

Python的语言风格很nice&#xff0c;但是这门语言对于windows并不算很友好&#xff0c;因为如果是初学者在windows环境下安装&#xff0c;简直是折磨人&#xff0c;会遇到各种蛋疼的情况。本文希望提供傻瓜式的教程&#xff0c;能够令读者成功安装Python和pip。 第一步&#xf…

什么是push通知栏消息?

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手 今天继续更新Austin&#xff0c;给Austin新增一个发送渠道&#xff08;PUSH通知栏推送&#xff09; Push通知栏消息是非常常见的&#xff0c;几乎每…

【elementUI】自定义封装el-upload上传内容

文章目录为实现如图所示功能&#xff0c;点击第一步弹出模态框&#xff0c;第二部将所有文件导入&#xff0c;第三步点击确定的时候上传到后台接口&#xff0c;封装一个组件 1.搭建template <div style"display: inline-block; margin-left: 10px;"><el-bu…

leaflet 设置多个marker,导出为一个geojson文件(066)

第066个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用L.marker设置多个markers, 通过数据重组,导出为geojson文件。 这里面 ayer instanceof L.Marker 是一个很重要的判断条件,可以灵活地去运用。 直接复制下面的 vue+openlayers源代码,操作2分钟即可…

Ubuntu20.04LTS设置DNS解析(解决系统重启DNS不生效的问题)

文章目录背景介绍解决方案背景介绍 近期买了一台戴尔的工作站&#xff0c;搭建的是Ubuntu20.04系统&#xff0c;使用时发现Ubuntu20.04系统上网经常卡顿&#xff08;上网方式是有线网&#xff0c;使用的千兆网口和千兆网线&#xff09;。 使用网速测试工具speedtest-cli进行了…

redis五大数据结构

目录1.1 Redis数据结构-动态字符串1.2 Redis数据结构-intset1.3 Redis数据结构-Dict1.4 Redis数据结构-ZipList1.5 Redis数据结构-ZipList的连锁更新问题1.6 Redis数据结构-QuickList1.7 Redis数据结构-SkipList1.8 Redis数据结构-RedisObject2.0 Redis数据结构-String2.1 Redi…

前端性能优化的整理笔记

&#x1f6b4; 前言大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库&#x1f3c4;利用碎片化的时间&#xff0c;系统的整理&#xff0c;性能优化的知识点。&#x1f3af; 前端性能优化&#xf…

初识网络原理,关于网络编程的基础

一.网络的重要性对于程序员而言&#xff0c;几乎所程序都依赖于网络&#xff0c;对于公司来说&#xff0c;几乎所有产品也是依赖于网络&#xff0c;这些产品不仅包括面向用户的产品&#xff0c;公司内部的一些服务也是基于公司内网来进行相互调用的。二.组网方式①基于网线直连…

每日学术速递2.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.YOWOv2: A Stronger yet Efficient Multi-level Detection Framework for Real-time Spatio-temporal Action Detection 标题&#xff1a;YOWOv2&#xff1a;用于实时时空动作检测的…

Jenkins构建项目和tomcat项目发布脚编写本详细教程jenkins 2.361版本

jenkins部署教程可查看上一篇文档jenkins部署指定任意版本和配置详细教程 jenkins 2.361版本示例_争取不加班&#xff01;的博客-CSDN博客Jenkins服务器去拉取代码&#xff0c;所以要下载git客户端 yum -y install git jenkins服务器下载下面就是构建发布任务测试可以性测试使用…

第一个Python程序-HelloWorld与Python解释器

数据来源 01 第一个Python程序-HelloWorld 1&#xff09;打开cmd&#xff1a; windows R 打开运行窗口输入cmd 2&#xff09;进入Python编写页面 输入&#xff1a;python 3&#xff09;然后输入要写的Python代码然后回车 print("Hello World!!!") print() …

利用AxhubCharts元件库在Axure RP中快速创建可视化统计图

利用AxhubCharts元件库在Axure RP中快速创建可视化统计图&#xff0c;可创建的可视化统计图有折线图、柱状图、堆叠柱状图、条形图、堆叠条形图、面积图、饼图、环形图、漏斗图、甘特图、散点图等。具体操作步骤见下文。 1.下载AxhubCharts.rplib元件库文件 2.载入AxhubChart…