美文网首页
算法学习之滑动窗口

算法学习之滑动窗口

作者: 北雁南飞_8854 | 来源:发表于2024-02-16 22:40 被阅读0次

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

给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动,你可以选择 相邻 两个数字并将它们交换。
请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数。
示例 1:
输入:nums = [1,0,0,1,0,1], k = 2
输出:1
解释:在第一次操作时,nums 可以变成 [1,0,0,0,1,1] 得到连续两个 1 。
示例 2:
输入:nums = [1,0,0,0,0,0,1,1], k = 3
输出:5
解释:通过 5 次操作,最左边的 1 可以移到右边直到 nums 变为 [0,0,0,0,0,1,1,1] 。
示例 3:
输入:nums = [1,1,0,1], k = 2
输出:0
解释:nums 已经有连续 2 个 1 了。
提示:
1 <= nums.length <= 105
nums[i] 要么是 0 ,要么是 1 。
1 <= k <= sum(nums)

思路:
构建新的数组 int zero[], zero的元素值表示相邻两个1之间的0的个数。
然后,在zero数组上进行滑动窗口计算。
注意:在zero上滑动窗口的大小为k - 1。对于窗口中每个位置的cost,就像一座山峰一样,两端是1,往中间逐个递增。我们这里第一个窗口的cost是[1, 2, 2, 1]。

class Solution {
    public int minMoves(int[] nums, int k) {
        List<Integer> zeros = new ArrayList<>();
        int count0 = 0, count1 = 0;
        for (int num : nums) {
            if (num != 1) count0++;
            else {
                if (count1 != 0) zeros.add(count0);
                count1++;
                count0 = 0;
            }
        }
        int[] preSum = new int[zeros.size() + 1];
        for (int i = 0; i < zeros.size(); i++) {
            preSum[i + 1] = preSum[i] + zeros.get(i);
        }
        int cost = 0;
        int left = 0, right = k - 2;
        for (int i = left; i <= right; i++) {
            cost += zeros.get(i) * (Math.min(i + 1, right - i + 1));
        }
        int minCost = cost;
        for (int i = 1, j = i + k - 2; j < zeros.size(); i++, j++) {
            int mid = (i + j) / 2;
            cost -= preSum[mid] - preSum[i - 1];
            cost += preSum[j + 1] - preSum[mid + k % 2];
            minCost = Math.min(minCost, cost);
        }
        return minCost;
    }
}

相关文章

  • Algorithm进阶计划 -- 滑动窗口

    滑动窗口算法滑动窗口框架滑动窗口运用 1. 滑动窗口框架 滑动窗口算法,核心思路是维护一个窗口,不断滑动,然后更新...

  • 大厂算法面试之leetcode精讲8.滑动窗口

    大厂算法面试之leetcode精讲8.滑动窗口 视频教程(高效学习):点击学习[https://xiaochen1...

  • 算法之滑动窗口

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

  • 算法总结之滑动窗口

    前言 滑动窗口类问题是面试当中的高频题,问题本身其实并不复杂,但是实现起来细节思考非常的多,想着想着可能因为变量变...

  • 3. 无重复字符的最长子串

    主要用到了滑动窗口算法两个指针之间就代表是一个滑动窗口,滑动窗口必须保证没有重复元素,同时保留最大的滑动窗口的大小...

  • Yolo知识整理,摘自网络

    Yolo 基本原理 滑动窗口与CNN 在介绍Yolo算法之前,首先先介绍一下滑动窗口技术,这对我们理解Yolo算法...

  • 限流框架系列之常见限流算法

    四种常见的限流算法 固定时间窗口限流算法 滑动时间窗口限流算法 令牌桶限流算法 漏桶限流算法 算法比较 算法确定参...

  • viola jones人脸检测原理

    Viola-jones人脸检测算法是一种基于滑动窗口的目标检测算法,但它却克服了滑动窗口检测带来的低效问题,可以用...

  • TCP/IP 协议(转)

    参考:TCP/IP 协议tcp窗口滑动以及拥塞控制解析TCP之滑动窗口(动画演示)

  • 你知道常见的限流算法有哪些吗?

    我们常见的限流算法有四种:计数器(固定窗口)算法、滑动窗口算法、漏桶算法、令牌桶算法。 为什么要限流 资源是有限的...

网友评论

      本文标题:算法学习之滑动窗口

      本文链接:https://www.haomeiwen.com/subject/lwzdedtx.html