# LeetCode算法学习之- 滑动窗口-1151. 最少交换次数来组合所有的 1

162 阅读2分钟

题目

给出一个二进制数组 data,你需要通过交换位置,将数组中 任何位置 上的 1 组合到一起,并返回所有可能中所需 最少的交换次数

分析

把1组合在一起 最小次数

  1. 最小次数min

  2. 交换位置 组合在一起

    1. 统计1 or 0的个数 在map中

    2. 动态滑动窗口 如果子串里面的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

\