【力扣刷题-滑动窗口篇】2134. 最少交换次数来组合所有的 1 II的定长滑动窗口解法

【力扣刷题-滑动窗口篇】(面试原题)2134. 最少交换次数来组合所有的 1 II的定长滑动窗口解法

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

示例 1:

输入:nums = [0,1,0,1,1,0,0]
输出:1
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[0,0,1,1,1,0,0] 交换 1 次。
[0,1,1,1,0,0,0] 交换 1 次。
[1,1,0,0,0,0,1] 交换 2 次(利用数组的环形特性)。
无法在交换 0 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 1 。

示例 2:

输入:nums = [0,1,1,1,0,0,1,1,0]
输出:2
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[1,1,1,0,0,0,0,1,1] 交换 2 次(利用数组的环形特性)。
[1,1,1,1,1,0,0,0,0] 交换 2 次。
无法在交换 0 次或 1 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 2 。

示例 3:

输入:nums = [1,1,0,0,1]
输出:0
解释:得益于数组的环形特性,所有的 1 已经聚集在一起。
因此,需要的最少交换次数为 0 。

提示:

  • 1 <= nums.length <= 10^5
  • nums[i]0 或者 1

题目链接

2134. 最少交换次数来组合所有的 1 II

最优解

class Solution {
   
   
    public int minSwaps(int[] nums) {
   
   
        // 最小交换次数,实质上是数组里的1的个数的窗口内,含有0的最小个数
        int length = nums.length;
        // 统计1的个数
        int oneLength = 0;
        // 求的是定长滑动窗口里0的最小个数
        int res 
### 力扣 1456 定长子串中元音的最大数目(滑动窗口算法 C++ 实现) 这道的核心思想是使用**滑动窗口**算法来高效地计算每个长度为 `k` 的子串中包含的元音字母数量,并找出最大值。 #### 解法分析 目要求在字符串 `s` 中找到长度为 `k` 的所有子串中,元音字母(a, e, i, o, u)数量最多的那个子串中的元音数量。 滑动窗口的基本思路如下: 1. **初始化窗口**:首先统计初始窗口(即从索引 `0` 到 `k-1` 的子串)中元音的数量。 2. **滑动窗口移动**:从索引 `k` 开始,每次向右移动一个字符,将新进入窗口的字符判断是否为元音,同时将离开窗口的字符也进行判断并更新计数。 3. **维护最大值**:在整个过程中维护一个变量,记录当前窗口中元音的最大数量。 #### C++ 实现代码 ```cpp #include <string> #include <algorithm> using namespace std; class Solution { public: int maxVowels(string s, int k) { int n = s.size(); int num = 0; // 初始化第一个窗口的元音数量 for (int i = 0; i < k; i++) { if (isVowel(s[i])) { num++; } } int res = num; // 滑动窗口遍历整个字符串 for (int i = k; i < n; i++) { if (isVowel(s[i])) { num++; // 新加入窗口的字符是元音 } if (isVowel(s[i - k])) { num--; // 离开窗口的字符是元音 } res = max(res, num); } return res; } private: bool isVowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; } }; ``` #### 时间复杂度与空间复杂度 - **时间复杂度**:`O(n)`,其中 `n` 是字符串 `s` 的长度。每个字符最多被访问两次(一次加入窗口,一次移出窗口),因此整体复杂度为线性。 - **空间复杂度**:`O(1)`,仅使用了常量级别的额外空间[^5]。 #### 优化点 - 在判断字符是否为元音时,可以使用哈希集合(如 `unordered_set<char>`)来提高查找效率,但在这个实现中直接使用条件判断更为简洁高效。 - 当窗口内元音数量达到最大可能值 `k` 时,可以直接返回结果,提前结束循环。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值