LeetCode 1703.得到连续 K 个 1 的最少相邻交换次数

题意

给定一个仅包含000111的数组,仅能交换其中相邻的两个数字,问至少多少次这样的操作可以使得至少kkk111相邻。

题解

取数组中任意kkk个相距最近的111,设它们出现的下标分别为a1,a2,...,ak.a_1,a_2,...,a_k.a1,a2,...,ak.考虑将它们交换多少次可以使得它们聚成连续的kkk111。有这样一个常用结论:对于数轴上的点a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak,使它们移动到一处的最小代价当它们都移动到该序列的中位数时取得(若长度为偶数,左边的和右边的均可)。按照这个结论,我们要将所有的111都移动到a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak的中位数旁边。先讨论
(1)(1)(1)长度k=2n+1k=2n+1k=2n+1kkk为奇数的情况:
要将a1,a2,...,an+1,...,a2n,a2n+1a_1,a_2,...,a_{n+1},...,a_{2n},a_{2n+1}a1,a2,...,an+1,...,a2n,a2n+1移动到an+1a_{n+1}an+1处,
首先将an,an+2a_{n},a_{n+2}an,an+2移动到an+1a_{n+1}an+1的左右两边,其消耗为(an+1−an−1)+(an+2−an+1−1);(a_{n+1}-a_n-1)+(a_{n+2}-a_{n+1}-1);(an+1an1)+(a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值