Leetcode 1151:最少交换次数来组合所有的 1(超详细的解法!!!)
发布日期:2021-06-29 16:06:17
浏览次数:2
分类:技术文章
本文共 1193 字,大约阅读时间需要 3 分钟。
给出一个二进制数组 data
,你需要通过交换位置,将数组中 任何位置 上的 1 组合到一起,并返回所有可能中所需 最少的交换次数。
示例 1:
输入:[1,0,1,0,1]输出:1解释: 有三种可能的方法可以把所有的 1 组合在一起:[1,1,1,0,0],交换 1 次;[0,1,1,1,0],交换 2 次;[0,0,1,1,1],交换 1 次。所以最少的交换次数为 1。
示例 2:
输入:[0,0,0,1,0]输出:0解释: 由于数组中只有一个 1,所以不需要交换。
示例 3:
输入:[1,0,1,0,1,0,0,1,1,0,1]输出:3解释:交换 3 次,一种可行的只用 3 次交换的解决方案是 [0,0,0,0,0,1,1,1,1,1,1]。
提示:
1 <= data.length <= 10^5
0 <= data[i] <= 1
解题思路
一个很容易想到的思路就是先统计总共有多少个1
,我们假设有m
个。然后以m
为滑动窗口的长度,通过滑动窗口的方式判断窗口中有多少个1
(假设为n
个),那么此时我们需要移动的次数就是m-n
,我们只需要找最小值即可。
class Solution: def minSwaps(self, data: List[int]) -> int: n, m = len(data), sum(data) cur, res = sum(data[:m]), m for i in range(m, n): res = min(res, m - cur) if data[i] == 1: cur += 1 if data[i - m] == 1: cur -= 1 return res
当然我们也可以通过前缀和的方式统计区间内1
的个数。
class Solution: def minSwaps(self, data: List[int]) -> int: n = len(data) pre = [0] * (n + 1) for i in range(1, n + 1): pre[i] = pre[i - 1] + data[i - 1] res = m = pre[-1] for i in range(m, n): res = min(res, m - (pre[i] - pre[i-m])) return res
我将该问题的其他语言版本添加到了我的
如有问题,希望大家指出!!!
转载地址:https://coordinate.blog.csdn.net/article/details/99169544 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月05日 05时08分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JSON.parse和eval的区别
2019-04-29
JQuery中$.ajax()方法参数详解
2019-04-29
正则表达式的数字实例
2019-04-29
【转】EasyUI 验证
2019-04-29
Django实战---商城购物车的增删改、显示和合并购物车
2019-04-29
Django项目实战----添加支付宝支付
2019-04-29
DRF框架---前言(简单使用)
2019-04-29
字符串外面是b“ “的转换 -亲测有效
2019-04-29
单通道和多通道卷积
2019-04-29
npy文件和pkl文件的保存和读取
2019-04-29
AUC粗浅理解笔记记录
2019-04-29
JavaScript 的addEventListener() 事件监听详解!
2019-04-29
上传图片到阿里云OSS和获取上传图片的url的详解 !
2019-04-29
Kafka为什么这么快?
2019-04-29
Java 生产者和消费者面试题
2019-04-29
本机电脑连接虚拟机redis失败解决方法
2019-04-29
Redis 六种淘汰策略和三种删除策略
2019-04-29
Java LinkedHashMap
2019-04-29
tomcat配置JVM
2019-04-29