2023-06-02:给定一个二进制数组 nums 和一个整数 k,

k位翻转 就是从 nums 中选择一个长度为 k 的 子数组,

同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1 都改成 0。

返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能,则返回 -1。

子数组 是数组的 连续 部分。

输入:nums = [0,1,0], K = 1。

输出:2。

答案2023-06-02:

大体步骤如下:

1.初始化一个大小为 $n$ 的队列 queue,用于存储需要翻转的子数组的起始下标。

2.初始化三个变量 lrans 分别为 0,表示当前队列的左端点、右端点和翻转的次数。

3.循环遍历数组 nums 中的每个元素 num

  • 如果队列 queue 中存在元素,并且当前元素下标减去队列左端点下标等于 k,则说明队列中的第一个元素已经过期,将左端点右移一位。

  • 如果队列 queue 中的元素个数为奇数,并且当前元素与队列最后一个元素不同,则将当前元素下标加入队列尾部,同时将翻转次数 ans 加 1。

4.如果队列 queue 长度大于 0 且队列最后一个元素下标加 k 大于数组长度,则返回 -1 表示无法完成翻转;否则,返回翻转次数 ans

时间复杂度为 $O(n)$,其中 $n$ 是数组 nums 的长度。循环遍历一次数组 nums,每个元素最多会被加入或弹出队列一次,因此时间复杂度是线性的。

空间复杂度也是 $O(n)$,因为需要使用一个大小为 $n$ 的队列来存储需要翻转的子数组的下标。同时,由于只保存了子数组的起始下标,因此空间复杂度不会超过 $n$。需要注意的是,在 C 和 C++ 中,使用指针代替数组时需要手动分配和释放内存,因此还需要额外的空间来存储指向动态分配内存的指针。

go完整代码如下:

package main

import "fmt"

func minKBitFlips(nums []int, k int) int {
n := len(nums)
queue := make([]int, n)
l, r, ans := 0, 0, 0 for i := 0; i < n; i++ {
if l != r && i-queue[l] == k {
l++
}
if (r-l)%2 == 1 == (nums[i] == 1) {
queue[r] = i
r++
ans++
}
} if l != r && queue[r-1]+k > n {
return -1
}
return ans
} func main() {
nums := []int{0, 1, 0}
k := 1
result := minKBitFlips(nums, k)
fmt.Println("Result:", result)
}

rust语言完整代码如下:

fn min_k_bit_flips(nums: Vec<i32>, k: i32) -> i32 {
let n = nums.len();
let mut queue = vec![0; n];
let (mut l, mut r, mut ans) = (0, 0, 0); for i in 0..n {
if l != r && i - queue[l] == k as usize {
l += 1;
} if (r as i32 - l as i32) & 1 == nums[i] {
queue[r] = i;
r += 1;
ans += 1;
}
} return if l != r && queue[r - 1] + k as usize > n {
-1
} else {
ans
};
} fn main() {
let nums = vec![0, 1, 0];
let k = 1;
let result = min_k_bit_flips(nums, k);
println!("Result: {}", result);
}

c++完整代码如下:

#include <iostream>
#include <vector> using namespace std; int minKBitFlips(vector<int>& nums, int k) {
int n = nums.size();
vector<int> queue(n);
int l = 0, r = 0, ans = 0;
for (int i = 0; i < n; i++) {
if (l != r && i - queue[l] == k) {
l++;
}
if (((r - l) & 1) == nums[i]) {
queue[r++] = i;
ans++;
}
}
return (l != r && queue[r - 1] + k > n) ? -1 : ans;
} int main() {
vector<int> nums = { 0, 1, 0 };
int k = 1;
int result = minKBitFlips(nums, k);
cout << "Result: " << result << endl;
return 0;
}

c语言完整代码如下:

#include <stdio.h>
#include <stdlib.h> int minKBitFlips(int* nums, int numsSize, int k) {
int* queue = (int*)malloc(numsSize * sizeof(int));
int l = 0, r = 0, ans = 0;
for (int i = 0; i < numsSize; i++) {
if (l != r && i - queue[l] == k) {
l++;
}
if (((r - l) & 1) == nums[i]) {
queue[r++] = i;
ans++;
}
}
free(queue);
return (l != r && queue[r - 1] + k > numsSize) ? -1 : ans;
} int main() {
int nums[] = { 0, 1, 0 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int k = 1;
int result = minKBitFlips(nums, numsSize, k);
printf("Result: %d\n", result);
return 0;
}

2023-06-02:给定一个二进制数组 nums 和一个整数 k, k位翻转 就是从 nums 中选择一个长度为 k 的 子数组, 同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1的更多相关文章

  1. 当在myeclipse里发送邮件有错误时,不妨把环境都改成jdk的

    当在myeclipse里发送邮件有错误时,不妨把环境都改成jdk的, 如果是jre的环境会出错,改成jdk的就行了.

  2. zf-关于查询机把index.jsp换成index_new.jsp页面之后把功能链接都改成新页面的简单方法

    一开始我都是找action 然后一个一个的改 把onmousedown="goURL('index.jsp')" 改成 onmousedown="goURL('index ...

  3. 复利计算5.0(改成Java版本)与 单元测试

    //由于C语言版本不方便单元测试,所以改成了java版本,部分代码如下:import java.util.Scanner; public class FuLi{ public static void ...

  4. 73. Set Matrix Zeroes 把矩阵同一行列的元素都改成0

    [抄题]: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place. ...

  5. 为什么很多第三方接口,都改成了基于http,直接传递json数据的方式来代替webservice?

    这实际上是三个问题,从WebService到今天流行的RESTful API(JSON) over HTTP,经历了数次变革 1 WebService有很多协议,为什么HTTP比较流行? WebSer ...

  6. 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ...

  7. MFC下debug改成release版本出现问题及解决办法

    自己在debug下成功运行了自己写的测试自己写第三方库的程序,这里有用到opencv库,所以同时用到了自己的库和opencv的库,需求因为要进行速度的测试,是想要把debug改成release版本,这 ...

  8. sqlserver服务器名称改成本地IP地址登录

    在安装sqlserver2008.2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangsan\SQLEXPR ...

  9. mysql数据库使用sql命令窗口查询的数据,改成sql语句导入到mysql数据库中

    1.查询语句为select * from t_table;导出的数据格式如下: 2.将数据文本备份,然后使用NOTEPAD++打开,然后只拷贝数据到新建txt中,然后进行如下替换: 1)将“ | ”分 ...

  10. AutoCAD如何方便截图放到Word文档,改成白底黑字

    将模型视图切换到布局2即可   比如下图所示的效果   先回到模型视图把所有线条颜色都改成白色,然后添加适当的标注(比如要受力分析,则在CAD中绘制箭头也很方便的),文字说明.然后切换到布局2就OK ...

随机推荐

  1. What's the best way to read and understand someone else's code?

    Find one thing you know the code does, and trace those actions backward, starting at the end Say, fo ...

  2. SSM整合的所有配置(配置类)

    导入依赖坐标pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artif ...

  3. 全网最详细中英文ChatGPT-GPT-4示例文档-人工智能助手从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  4. 【python爬虫】爬取美女图片

    一,导入包文件 os:用于文件操作.这里是为了创建保存图片的目录 re:正则表达式模块.代码中包含了数据处理,因此需要导入该模块 request:请求模块.通过该模块向对方服务器发送请求获取数据包 l ...

  5. Zabbix - 部署随笔

    部署Zabbix服务端 准备机器,初始化环境 #查看IP地址 [root@Minimal ~]# ifconfig ens33 | awk 'NR==2{print $2}' 10.0.0.243 # ...

  6. CSS实现单行或者多行文本溢出隐藏并且显示省略号

    一.单行超出显示省略号如果文字超出父元素指定宽度,文字会自动换行,而连续不间断数字和英文字母(没有其他字符)不会自动换行: 详细步骤: 第一步(不换行):white-space:nowrop;(对于连 ...

  7. C# 反射 判断类型是否是列表

    1 /// <summary> 2 /// 判断类型是否为可操作的列表类型 3 /// </summary> 4 /// <param name="type&q ...

  8. Python 遍历整个列表

    操作列表 遍历整个列表,无论列表有多长,循环让列表中的每一个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包含数以千至数百万个元素的列表. 遍历整个列表 通过for循环解决遍历 从列 ...

  9. Python-psycopg2的简单使用

    一.简介 psycopg2 库是 python 用来操作 postgreSQL 数据库的第三方库. 二.安装 1.执行如下命令安装 pip3 install psycopg2 2.使用Pycharm安 ...

  10. 【漏洞分析】ReflectionToken BEVO代币攻击事件分析

    前言 BEVO代币是一种Reflection Token(反射型代币),并且拥有通缩的特性.关于Reflection Token更为详细的说明可参考这篇文章.然后目前浏览到的很多分析报告没有指出其漏洞 ...