力扣(LeetCode)1703. 得到连续 K 个 1 的最少相邻交换次数(C++)

news2024/9/22 17:21:11

贪心

将至少连续 K K K 1 1 1 放在一起。首先考虑他们是相邻着放在一起的,然后考虑性质 : 设相邻摆放后,起始 1 1 1 的位置是 m i d {mid} mid ,对于每个 1 1 1 的位置 a i a_i ai ,它需要被摆放的位置是 a m i d + i a_{mid}+i amid+i 。考虑一个等价代换,令 a i ′ = a i − i a^{'}_i = a_i - i ai=aii ,那么 a i ′ a^{'}_i ai a m i d a_{mid} amid 的距离等于 a i a_i ai a m i d + i a_{mid}+i amid+i 的距离。这一步固定了待求距离的点。

记录所有 1 1 1 位置,存于数组 a a a ,每次考虑 K K K 个连续的 1 1 1 ,即 R − L + 1 = K R-L+1=K RL+1=K 。可以证明,要使距离之和最小,只要取中间点即可 (贪心货仓选址)。

先分段讨论,对于左端,距离之和有 : ( a m i d − a L ) + ( a m i d − a L + 1 ) + ⋯ + ( a m i d − a m i d − 1 ) = a m i d × ( m i d − L ) − ( S m i d − S L − 1 ) (a_{mid} - a_{L})+(a_{mid} - a_{L+1})+\dots+(a_{mid} - a_{mid-1})=a_{mid} \times (mid-L)-(S_{mid}-S_{L-1}) (amidaL)+(amidaL+1)++(amidamid1)=amid×(midL)(SmidSL1) 。其中 S S S 是前缀和数组。由连续项,想到前缀和。

对于左端,距离之和有 : ( a m i d + 1 − a m i d ) + ( a m i d + 2 − a m i d ) + ⋯ + ( a R − a m i d ) = ( S R − S m i d ) − a m i d × ( R − m i d ) (a_{mid+1} - a_{mid})+(a_{mid+2} - a_{mid})+\dots+(a_{R} - a_{mid})=(S_{R}- S_{mid})-a_{mid} \times (R-mid) (amid+1amid)+(amid+2amid)++(aRamid)=(SRSmid)amid×(Rmid)

综上,距离之和 a m i d × ( 2 × m i d − r − l ) + s r − s m i d − s m i d − 1 + s l − 1 ) a_{mid}\times(2\times mid-r-l) + s_r - s_{mid} - s_{mid-1} + s_{l-1}) amid×(2×midrl)+srsmidsmid1+sl1)

class Solution {
public:
    int minMoves(vector<int>& nums, int k) {
        vector<int> a;
        for(int i = 0 ;i< nums.size();i++)
            if(nums[i])
                a.push_back(i-a.size());
        int n = a.size();
        int s[n+1];
        for(int i = 1;i<=n;i++)
            s[i] = s[i-1]+a[i-1];
        int ans = INT_MAX ;
        for(int l = 1;l<=n-k+1;l++){
            int r = l + k - 1;
            int mid = (l+r)>>1;
            ans = min(ans,a[mid-1]*(2*mid-r-l) + s[r] - s[mid] - s[mid-1] + s[l-1]);
            //由于求了前缀和,a对应的下标要左移1.
        }
        return ans;
    }
};
  1. 时间复杂度 : O ( n ) O(n) O(n) n n n 是数字总数,一次遍历找 1 1 1 ,构造前缀和,遍历 1 1 1 的时间复杂度 O ( n ) O(n) O(n)
  2. 空间复杂度 : O ( n ) O(n) O(n) , 存储 1 1 1 ,前缀和的空间复杂度 O ( n ) O(n) O(n)

AC

AC

致语

  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

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

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

相关文章

【Effective_Objective-C_2对象,消息,运行期2】

文章目录前言12.理解消息转发机制消息转发动态方法解析动态方法解析的前提备援接受者完整的消息转发消息转发全部流程要点总结13.用“方法调配技术”调试“黑盒方法”方法调配动态消息派发系统和IMP如何交换方法实现要点总结14.理解“类对象”的用意在类的继承体系中查询类型信…

【经济学】【综合篇】经济机器是怎样运行的

原视频&#xff1a;经济机器是怎样运行的 (时长30分钟) Ray Dalio 前言&#xff1a;经济与我们每一个人息息相关&#xff0c;经济社会的一些变革或举措也会直接或间接的反映到我们每个个体身上。了解经济&#xff0c;提高自己的认知&#xff0c;可以帮助我们更好的参与经济活动…

excel数据统计技巧:如何对表格区域内所含字母进行计数

小王是一家快餐店的财务人员。受疫情影响公司开展了店外销售业务&#xff0c;所有销售采取手工记账的方式。为了简化销售人员的工作量&#xff0c;为每种商品指定了一个字母代码&#xff0c;营业员只需要记录每一单销售的商品代码即可。下面是根据手工记账登记的销售记录表&…

论文投稿指南——中国(中文EI)期刊推荐(第8期)

&#x1f384;&#x1f384; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xff0c;中文期刊的…

【运筹优化】子集和问题(Subset Sum Problems , SSP)介绍 + 动态规划求解 + Java代码实现

文章目录一、问题介绍二、动态规划求解思路三、Java代码实现一、问题介绍 子集和问题&#xff08;Subset Sum Problems , SSP&#xff09;&#xff0c;它是复杂性理论中最重要的问题之一。 SSP会给定一组整数 a1,a2,....,ana_1,a_2,....,a_na1​,a2​,....,an​ &#xff0c;…

手写Spring7(实现bean的初始化、销毁)

文章目录目标设计流程项目结构一、实现1、 定义初始化和销毁方法的接口2、Bean属性定义新增初始化和销毁3、执行 Bean 对象的初始化方法4、定义销毁方法适配器(接口和配置)5、定义注册销毁对象、销毁实现6、创建Bean时注册销毁方法对象7、虚拟机关闭钩子注册调用销毁方法二、测…

UNIAPP实战项目笔记55 自定义Tabbar并使用Tabbar事件拦截未登录跳转到登录页面

UNIAPP实战项目笔记55 自定义Tabbar并使用Tabbar拦截未登录跳转到登录页面 点击购物车和我的的时候需要拦截并验证登录 通过验证的直接跳转,为通过验证的跳转到登录页面 通过自定义tabbar来实现 实际案例图片 正常跳转 拦截跳转 代码 pages.json 页面配置 {"pages&qu…

JDBC编程相关知识(实现图书管理系统进阶版)

目录 一、配置MySQL数据库驱动包 二、JDBC常规操作 1、创建数据源 2、建立连接 3、操作数据库&#xff0c;执行sql语句 4、关闭资源 三、JDBC实现图书管理系统 1、建表 2、连接数据库 3、创建实体类 a、Book类 b、BookShelf类 c、User类 d、Administrator类 e、…

jsp+ssm计算机毕业设计大学生足球预约信息【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

java计算机毕业设计springboot+vue青少年编程在线考试系统

项目介绍 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。 论文主要是对青少…

AIGC stable diffusion完整部署手册 for linux

准备工作 &#xff08; GPU服务器4G显卡 &#xff09;&#xff1a; 1. 建议 Python3.10.7 以上的版本&#xff0c;最低不能低于3.10.5 2. pip pip3的版本升级到最新 pip 22.3.1 3. 安装python3.10.7之前先安装和升级 openssl-1.1.1q 4. yum安装源改成 阿里云 或者 清华 …

English Learning - L1-4 从此没有不会的表达(下) 2022.12.15 周四

English Learning - L1-4 从此没有不会的表达&#xff08;下&#xff09; 2022.12.15 周四5 动名词5.1 动名词都有什么作用作主语做表语做定语动名词做定语有啥讲究&#xff1f;做宾语5.2 动名词的复合结构---成功加入动名词自己的主语逻辑主语动名词复合结构作宾语时用普通格和…

2021年度汇总丨20大热门TWS耳机功能配置汇总解析

疫情下的时间匆匆而过&#xff0c;2021已成为过去&#xff0c;2022年正式开启。在过去的一年中&#xff0c;以TWS耳机为代表的音频市场依旧保持着健康稳定的发展&#xff0c;彰显这一市场超强的活力和朝好的未来发展。 回顾2021&#xff0c;这一年中&#xff0c;我爱音频网365天…

直线检测霍夫变换VS深度学习

1. 引言 直线检测有很多应用&#xff1a;例如&#xff0c;创建矢量化图、端点检测等。在这篇文章中&#xff0c;我们不讨论其具体的应用程序&#xff0c;而是重点关于于如何使用传统算法和深度学习的方法来进行直线检测&#xff0c;这里我们将对二者进行相关比较。 闲话少说&a…

经典算法之异或运算(无进位相加)

目录异或运算的定义异或运算的性质异或运算的应用交换两数翻转指定位寻找单身狗异或运算的定义 众所周知&#xff0c;计算机中的所有数据都是以二进制&#xff08;0或者1&#xff09;的形式存储。而异或运算符&#xff08;^&#xff09;就是将参加运算的两个数据&#xff0c;按…

C语言—数据类型

通过sizeof运算符获取数据类型的大小&#xff0c;int占4个字节&#xff0c;表示一个int变量可以存储32位的数据&#xff1b; vs2022中&#xff0c;sizeof运算符返回的结果是一个64位 (8bytes)的无符号整型的值&#xff0c;所以占位符要使用%lld&#xff1b; #include <std…

【空气起动系统控制】使用PID调节起动机入口压力值

前段时间师傅让做一个空起系统的建模&#xff0c;结果给忘了&#xff0c;现在趁着这几天疫情封控期间在家搞一搞&#xff0c;断断续续搞了五天&#xff0c;空起系统控制的相关资料太少了&#xff0c;还好最后弄出来了&#xff0c;虽然最后还存在点小问题&#xff0c;不过大体上…

【Java编程】SSH:Struts、Spring、Hibernate

SSH&#xff1a;Struts、Spring、HibernateSSH 框架指的是 Struts、Spring 和 Hibernate 三者的集成。集成 SSH 框架的系统从职责上分为表示层、业务逻辑层、数据持久层和域模块层。Struts 属于 MVC 框架的一种&#xff0c;提供了对 MVC 系统底层的支持&#xff0c;负责 MVC 的…

汽车ECU通信相关验证项有哪些?

已剪辑自: https://mp.weixin.qq.com/s/-fIAXkS37r6jvnuA7yIQDA 汽车电子的高速发展决定了基础软件所面临的要求将会更加严格&#xff0c;其要求会覆盖软件的安全性、稳定性、可扩展性等方方面面。为了提高软件质量&#xff0c;降低软件应用风险&#xff0c;构建高安全、高可靠…

什么是网站安全?如何查询网站在百度是否安全?

什么是网站安全&#xff1f; 百度词条的定义为网站安全是指出于防止网站受到黑客入侵者对其网站进行挂马&#xff0c;篡改网站源代码&#xff0c;被窃取数据等行为而做出一系列的安全防御工作&#xff0c;在我的理解中&#xff0c;网站安全就是当有人攻击你的网站时&#x…