力扣 第 122 场双周赛 解题报告 | 珂学家 | 脑筋急转弯 + 滑窗反悔堆

news2025/1/16 16:59:46

前言

image.png


整体评价

倒开差点崩盘,T4这个反悔堆写吐了,T3往众数上去猜了,幸好case良心。


T1. 将数组分成最小总代价的子数组 I

思路: 取 nums[1:] 的最小2个值

可以部分排序,这样更快捷

class Solution {
    public int minimumCost(int[] nums) {
        Arrays.sort(nums, 1, nums.length);
        return nums[0] + nums[1] + nums[2];
    }
}

T2. 判断一个数组是否可以变为有序

思路: 分组分段排序

把连续同构子数组排序(同构即1的个数相同)

最后验证一把即可

class Solution {
    public boolean canSortArray(int[] nums) {
        // 分组分段排序
        int n = nums.length;
        int i = 0;
        while (i < n) {
            int j = i + 1;
            while (j < n && Integer.bitCount(nums[j - 1]) == Integer.bitCount(nums[j])) {
                j++;
            }
            Arrays.sort(nums, i, j);
            i = j;
        }
        
        // 最后验证下
        for (i = 0; i < n - 1; i++) {
            if (nums[i] > nums[i + 1]) return false;
        }
        return true;
    }
}

T3. 通过操作使数组长度最小

思路: 找规律, 从最小数切入

可以发现:

小数可以剔除大数 小数可以剔除大数 小数可以剔除大数

比如 a , b 两数 ( a < b ) , 则 a   m o d   b = a , 相当于单独剔除 b , 保留小数 a a,b两数(a\lt b), 则 a\ mod\ b = a, 相当于单独剔除b, 保留小数a a,b两数(a<b),a mod b=a,相当于单独剔除b,保留小数a

那大数可以剔除小数呢? 那大数可以剔除小数呢? 那大数可以剔除小数呢?

  • a , b ( a < b ) , a   m o d   b ≠ 0 , 则构建了更小的数 c ( c < a ) a,b(a\lt b), a\ mod\ b \ne 0, 则构建了更小的数c(c\lt a) a,b(a<b),a mod b=0,则构建了更小的数c(c<a)
  • a , b ( a < b ) , a   m o d   b = 0 , 则不行 a,b(a\lt b), a\ mod\ b = 0, 则不行 a,b(a<b),a mod b=0,则不行

令最小值为v,个数为m

如果存在一个数,其余最小数不为0,则结果为1

如果不存在这样的数,则结果为 ( m + 1 ) / 2 (m+1)/2 (m+1)/2

class Solution {
    public int minimumArrayLength(int[] nums) {
        if (nums.length <= 2) return 1;
        
        int minV = Arrays.stream(nums).min().getAsInt();
        
        int minNum = 0;
        for (int v: nums) {
            // 存在一个数可以构造更小的数
            if (v % minV != 0) return 1;
            else if (v == minV) minNum++;
        }
        
        return (minNum + 1) / 2;
    }
}

T4. 将数组分成最小总代价的子数组 II

思路: 反悔堆

划分型DP只是幌子,核心是

滑窗区间 ( d i s t ) 内的最小 k − 1 个数之和 滑窗区间(dist)内的最小k-1个数之和 滑窗区间(dist)内的最小k1个数之和

这个过程中,有旧数据的滑出,有新数据的滑入,还有实时更新k-1个最小和。

除了滑窗的框架,还需要额外引入

对顶堆 对顶堆 对顶堆

即原先k-1最小的集合元素,因窗口挪动,被更小的新值替换(非窗口有效范围原因)

class Solution {

    public long minimumCost(int[] nums, int k, int dist) {
        long inf = Long.MAX_VALUE;
        long ans = inf;

        long res = nums[0];
        int n = nums.length;
        int cnt = 1;

        // 两者构建对顶堆
        // 候选堆(最小堆)
        PriorityQueue<int[]> minPq = new PriorityQueue<>(Comparator.comparing(x -> x[0]));
        // k-1集合堆(最大堆)
        PriorityQueue<int[]> maxPq = new PriorityQueue<>(Comparator.comparing(x -> -x[0]));

        for (int i = 1; i <= dist + 1; i++) {
            minPq.offer(new int[] {nums[i], i});
        }

        boolean[] vis = new boolean[n];
        while (cnt < k) {
            int[] cur = minPq.poll();
            res += cur[0];
            vis[cur[1]] = true;
            maxPq.offer(new int[] {cur[0], cur[1]});
            cnt++;
        }
        ans = Math.min(ans, res);

        for (int i = 1; i + 1 + dist < n; i++) {
            // 滑窗
            if (vis[i] == true) {
                cnt--;
                res -= nums[i];
            }

            minPq.offer(new int[] {nums[i + 1 + dist], i + 1 + dist});
            // 保证k-1大小
            while (cnt < k && !minPq.isEmpty()) {
                int[] cur = minPq.poll();
                // 惰性删除
                if (cur[1] <= i) continue;
                vis[cur[1]] = true;
                res += cur[0];
                cnt++;
                maxPq.offer(cur);
            }

            while (!maxPq.isEmpty() && !minPq.isEmpty()) {
                // 惰性删除
                int[] cur2 = maxPq.peek();
                if (cur2[1] <= i) {
                    maxPq.poll();
                    continue;
                }
                // 惰性删除
                int[] cur1 = minPq.peek();
                if (cur1[1] <= i) {
                    minPq.poll();
                    continue;
                }

                if (cur1[0] >= cur2[0]) break;

                // 反悔核心逻辑
                res = res + cur1[0] - cur2[0];
                vis[cur1[1]] = true;
                vis[cur2[1]] = false;
                minPq.poll();
                maxPq.poll();
                maxPq.offer(cur1);
                minPq.offer(cur2);
            }

            ans = Math.min(ans, res);
        }

        return ans;
    }
}

写在最后

image.png

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

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

相关文章

Github操作网络异常笔记

Github操作网络异常笔记 1. 源由2. 解决2.1 方案一2.2 方案二 3. 总结 1. 源由 开源技术在国内永远是“蛋疼”&#xff0c;这些"政治"问题对于追求技术的我们&#xff0c;形成无法回避的障碍。 $ git pull ssh: connect to host github.com port 22: Connection ti…

Qt QCustomPlot 绘制子轴

抄大神杰作&#xff1a;QCustomplot&#xff08;五&#xff09;QCPAxisRect进行子绘图-CSDN博客文章浏览阅读5.9k次&#xff0c;点赞7次&#xff0c;收藏60次。文中介绍了QCustomPlot 子绘图需要掌握的类&#xff0c;也就是Matlab中的subplot&#xff0c;最后给出了一个完整的例…

EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码

这里是CIP资料的协议层级图&#xff0c;讲解协议构造。 ODVA&#xff08;www.ODVA.org&#xff09;成立于1995年&#xff0c;是一个全球性协会&#xff0c;其成员包括世界领先的自动化公司。结合其成员的支持&#xff0c;ODVA的使命是在工业自动化中推进开放、可互操作的信息和…

人工智能原理实验1(2)——传教士与野人问题

&#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1; 有n个牧师和n个野人准备渡河&#xff0c;但只有一条能容纳c个人的小船&#xff0c;为了防止野人侵犯牧师&#xff0c;要求无论在何处&#xff0c;牧师的人数不得少于野人的人数(除非牧师人数为0)&#xff0c;且假…

算法练习-替换数字(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;字符串 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个字符串S,它包含小写字母和数字字符&#xff0…

全国各省市上市公司数量数据,Shp、excel格式,含上市企业数量、行政区划中心点位经纬度等字段

基本信息. 数据名称: 全国各省市上市公司数量数据 数据格式: Shp、excel 数据时间: 2023年1月 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2provin_dm省份代码3city城市名…

力扣刷MySQL-第七弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

kxmalls外卖生鲜多商户&#xff0c;针对中小商户、企业和个人学习者开发。使用Java编码&#xff0c;采用SpringBoot、Mybatis-Plus等易用框架&#xff0c;适合个人学习研究。同时支持单机部署、集群部署&#xff0c;用户与店铺范围动态定位&#xff0c;中小商户企业可根据业务动…

C语言的编译和链接

每日一言 要保持希望在每天清晨太阳升起。 --自己 前言 当我们写下C语言代码&#xff08;源文件、以.c为后缀&#xff09;的时候&#xff0c;他需要经过一个翻译环境&#xff0c;被处理后形成一个可执行程序&#xff08;以.exe为后缀&#xff09;。形成的这个可执行程序里面放…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

matlab抽取与插值

什么是抽取&#xff1f; 我们假设一个数字信号 x ( n ) , n 1 , 2 , . . . , N x(n),n1,2,...,N x(n),n1,2,...,N共有 N N N个点&#xff0c;抽取就是每个几个点抽1个点&#xff0c;比如2倍抽取&#xff0c;那么抽取后的信号为 y ( n ) , y ( 1 ) x ( 1 ) , y ( 2 ) x ( 3 …

WebSocket-黑马好客租房

文章目录 网站中的消息功能如何实现&#xff1f;什么是WebSocket&#xff1f;http与websocket的区别httpwebsocket 浏览器支持情况快速入门创建itcast-websocket工程websocket的相关注解说明实现websocket服务测试编写js客户端 SpringBoot整合WebSocket导入依赖编写WebSocketHa…

Python实现M-Estimators稳健线性回归模型(RLM算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 M-Estimators 是稳健统计估计中的一个重要概念&#xff0c;它们在处理含有异常值、离群点或者影响点的…

GPT应用_AutoGPT

项目地址&#xff1a;https://github.com/Significant-Gravitas/AutoGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 单独使用 ChatGPT 时&#xff0c;只提供基本的聊天&#xff0c;无法实现复杂多步的功能&#xff0c;以及与其它应用交互&#xff0c;如果想提供某种功…

【开源】基于JAVA的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

NLP论文阅读记录 - 2021 | WOS 使用预训练的序列到序列模型进行土耳其语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1 预训练的序列到序列模型2.2 抽象文本摘要 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos&#xff0c;查看所有任务的栈的信息&#xff0c;包括任务名&#xff0c;任务状态&#xff0c;任务优先级&#xff0c;空闲栈&#xff0c;任务号。 运行结果如下 只需要使用一个函数vTaskList &#xff1a;获得任务的统计信息&#xff0c;形式为…

【leetcode】移除元素

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…