题目
给出一个二进制数组
data,你需要通过交换位置,将数组中 任何位置 上的 1 组合到一起,并返回所有可能中所需 最少的交换次数。
分析
把1组合在一起 最小次数
最小次数min
交换位置 组合在一起
统计1 or 0的个数 在map中
动态滑动窗口 如果子串里面的0>子串外面的1 则不满足
解法:滑动窗口
思想
1.先使用map 统计所有的1 和 0 的个数
2.然后采用动态滑动窗口的方式不断移动右边指针,同时不断断句覆盖的子串中的1 和0 的个数
3.当子串中的0的个数大于外面的 子串外面1的个数 则左边收敛
4.直到满足子串中的 0的个数 == 子串外面1的个数 则取值
5.因为是最小变换次数 所以 Math.min(min, curMap[0]);=》 取子串中0最少的情况
*/
/**
* @param {number[]} data
* @return {number}
*/
var minSwaps = function (data) {
// 左指针
let j = 0;
let min = Infinity;
// 统计总的1 和0 的个数
const oriMap = {
1: 0,
0: 0,
};
for (let i = 0; i < data.length; i++) {
oriMap[data[i]] = (oriMap[data[i]] || 0) + 1;
}
const curMap = {
1: 0,
0: 0,
};
// 采用滑动窗口不断向右移动
for (let i = 0; i < data.length; i++) {
curMap[data[i]] = (curMap[data[i]] || 0) + 1;
// 不满足条件则左边收敛
while (curMap[0] > oriMap[1] - curMap[1]) {
curMap[data[j]] = (curMap[data[j]] || 0) - 1;
j++;
}
// 满足条件则取最小值
if (curMap[0] === oriMap[1] - curMap[1]) {
min = Math.min(min, curMap[0]);
}
}
return min;
};
//时间复杂度:O(n)
//空间复杂度:O(n)
总结
今天这道题是主要是练习如何使用 动态尺寸的滑动窗口 来求最小的值的题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
\