1703.得到连续K个1的最少相邻交换次数
链接:1703.得到连续K个1的最少相邻交换次数
难度:Hard
标签:贪心、数组、前缀和、滑动窗口
简介:请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数。
题解 1 - cpp
- 编辑时间:2022-12-23
- 执行用时:564ms
- 内存消耗:122.5MB
- 编程语言:cpp
- 解法介绍:[参考链接](https://leetcode.cn/problems/minimum-adjacent-swaps-for-k-consecutive-ones/solution/tu-jie-zhuan-huan-cheng-zhong-wei-shu-ta-iz4v/)。
class Solution {
public:
    int minMoves(vector<int>& nums, int k) {
        int ans = 0x7fffffff;
        vector<int> ilist, slist(1, 0);
        for (int i = 0, cnt = 0; i < nums.size(); i++) {
            if (nums[i] == 1) {
                ilist.push_back(i - cnt++);
                slist.push_back(slist.back() + ilist.back());
            }
        }
        for (int i = 0; i + k <= ilist.size(); i++)
            ans = min(ans, slist[i + k] + slist[i] - 2 * slist[i + k / 2] - k % 2 * ilist[i + k / 2]);
        return ans;
    }
};