LeetCode - 2134 最少交换次数来组合所有的 1 II
LeetCode 所有 组合 II 次数 交换 最少
2023-09-14 09:04:04 时间
目录
题目来源
2134. 最少交换次数来组合所有的 1 II - 力扣(LeetCode)
题目描述
交换定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。
示例
输入 | nums = [0,1,0,1,1,0,0] |
输出 | 1 |
解释 | 这里列出一些能够将所有 1 聚集在一起的方案:
因此,需要的最少交换次数为 1 。 |
输入 | nums = [0,1,1,1,0,0,1,1,0] |
输出 | 2 |
解释 | 这里列出一些能够将所有 1 聚集在一起的方案:
因此,需要的最少交换次数为 2 。 |
输入 | nums = [1,1,0,0,1] |
输出 | 0 |
解释 | 得益于数组的环形特性,所有的 1 已经聚集在一起。 因此,需要的最少交换次数为 0 。 |
提示
1 <= nums.length <= 105
nums[i]
为0
或者1
题目解析
本题和算法 - 最少交换次数来组合所有的1_伏城之外的博客-CSDN博客
题目的区别,在于本题是环形数组,上面两个题目的数组不是环形的。
但是环形数组并不意味着难度更大,只是单纯地扩展了组合的情况而已,如下图所示
因此,只要在前面算法题的解题思路上,扩展一些情况即可
算法源码
function getMinSwapCount(arr) {
// 统计1的个数
let count = arr.reduce((pre, cur) => cur === 1 ? pre + 1 : pre, 0)
if(count === 1) return 0
let minSwapCount = 0
for(let i=0; i<count; i++) {
if(arr[i] === 0) minSwapCount++
}
let len = arr.length
let tmpSwapCount = minSwapCount
for(let i=1; i<len; i++){
let preLeft = i-1
let right = i + count - 1
// 滑窗有边界可以越界,越界后索引相当于从头来,比如right=arr.length索引等价于right=0
if(right >= len) {
right -= len
}
if(arr[right]===1 && arr[preLeft]===0) {
tmpSwapCount--
} else if(arr[right]===0 && arr[preLeft]===1) {
tmpSwapCount++
}
minSwapCount = Math.min(minSwapCount, tmpSwapCount)
}
return minSwapCount
}
console.log(getMinSwapCount([0,1,0,1,1,0,0]))
console.log(getMinSwapCount([0,1,1,1,0,0,1,1,0]))
console.log(getMinSwapCount([1,1,0,0,1]))
相关文章
- ☆打卡算法☆LeetCode 221. 最大正方形 算法解析
- leetcode-54螺旋矩阵
- Leetcode分类——贪心算法
- 如何看待力扣(LeetCode)经典会员
- 【刷题day07】LeetCode(力扣)每日一刷。[876. 链表的中间结点][142. 环形链表 II][121. 买卖股票的最佳时机]
- leetcode刷题(127)——1575. 统计所有可行路径
- leetcode刷题(128)——1575. 统计所有可行路径,动态规划解法
- javascript分类刷leetcode动态规划篇
- 前端工程师leetcode算法面试--二分搜索算法(上)
- 每日一道leetcode:7. 整数反转
- 【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )
- LeetCode每日一题之817题链表组件