2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1,

每一次移动,你可以选择 相邻 两个数字并将它们交换。

请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数。

输入:nums = [1,0,0,1,0,1], k = 2。

输出:1。

来自左程云

答案2023-09-30:

步骤描述:

1.定义一个函数 minMoves(nums []int, k int),传入一个整数数组 nums 和一个整数 k。

2.如果 k 等于 1,直接返回 0。

3.获取数组 nums 的长度 n。

4.计算目标窗口中索引和的左半部分,即 (k - 1)/2 个索引的和,赋值给 leftAimIndiesSum。

5.计算目标窗口中索引和的右半部分,即 (k-1)*k/2 - leftAimIndiesSum,赋值给 rightAimIndiesSum。

6.初始化一个变量 ans,并将其赋值为最大整数。

7.初始化左边窗口的起始索引 l 为 0,中间位置索引 m 为 (k - 1)/2,右边窗口的结束索引 r 为 k - 1。

8.计算左边窗口需要的 1 的个数 leftNeedOnes 为 (k - 1)/2 + 1。

9.初始化左边窗口的起始索引 leftWindowL 为 0,左边窗口的 1 的个数 leftWindowOnes 为 0,左边窗口中索引和的总和 leftWindowOnesIndiesSum 为 0。

10.遍历数组 nums,i 从 0 到 m-1,进行如下操作:

10.1.如果 nums[i] 等于 1,将 leftWindowOnes 加一,leftWindowOnesIndiesSum 加上 i。

11.计算右边窗口需要的 1 的个数 rightNeedOnes 为 k - leftNeedOnes。

12.初始化右边窗口的结束索引 rightWindowR 为 m,右边窗口的 1 的个数 rightWindowOnes 为 nums[m],右边窗口中索引和的总和 rightWindowOnesIndiesSum 为 0。

13.如果 nums[m] 等于 1,将 rightWindowOnesIndiesSum 赋值为 m。

14.对于 l、m、r 从初始状态开始,进行如下操作:

14.1.如果 nums[m] 等于 1,将 leftWindowOnes 加一,leftWindowOnesIndiesSum 加上 m,rightWindowOnes 减一,rightWindowOnesIndiesSum 减去 m。

14.2.当 leftWindowOnes 大于 leftNeedOnes 时,如果 nums[leftWindowL] 等于 1,则将 leftWindowOnes 减一,leftWindowOnesIndiesSum 减去 leftWindowL,左窗口的起始索引 leftWindowL 加一。

14.3.当 rightWindowOnes 小于 rightNeedOnes 且 rightWindowR+1 小于 n 时,如果 nums[rightWindowR+1] 等于 1,则将 rightWindowOnes 加一,rightWindowOnesIndiesSum 加上 rightWindowR+1,右窗口的结束索引 rightWindowR 加一。

14.4.如果左窗口的 1 的个数等于 leftNeedOnes,右窗口的 1 的个数等于 rightNeedOnes,说明找到了满足要求的窗口。将 ans 更新为 leftAimIndiesSum 减去 leftWindowOnesIndiesSum,再加上 rightWindowOnesIndiesSum 减去 rightAimIndiesSum 和 ans 中的较小值。

14.5.更新 leftAimIndiesSum 为 m+1-l,更新 rightAimIndiesSum 为 r-m。

14.6.将 l 加一,m 加一,r 加一。

15.返回 ans。

总的时间复杂度:根据代码逐行分析,其中的遍历是线性时间复杂度 O(n),其余操作的时间复杂度均为常数时间复杂度。所以总的时间复杂度为 O(n)。

总的额外空间复杂度:除了函数调用栈外,代码中没有使用额外空间,所以额外空间复杂度为 O(1)。

go完整代码如下:

package main

import (
"fmt"
) func minMoves(nums []int, k int) int {
if k == 1 {
return 0
}
n := len(nums)
x := (k - 1) / 2
leftAimIndiesSum := x * (x + 1) / 2
rightAimIndiesSum := int((k-1)*k/2 - leftAimIndiesSum)
ans := int(^uint(0) >> 1)
l := 0
m := (k - 1) / 2
r := k - 1
leftNeedOnes := m + 1
leftWindowL := 0
leftWindowOnes := 0
leftWindowOnesIndiesSum := 0
for i := 0; i < m; i++ {
if nums[i] == 1 {
leftWindowOnes++
leftWindowOnesIndiesSum += i
}
}
rightNeedOnes := k - leftNeedOnes
rightWindowR := m
rightWindowOnes := nums[m]
rightWindowOnesIndiesSum := 0
if nums[m] == 1 {
rightWindowOnesIndiesSum = m
}
for ; r < n; l, m, r = l+1, m+1, r+1 {
if nums[m] == 1 {
leftWindowOnes++
leftWindowOnesIndiesSum += m
rightWindowOnes--
rightWindowOnesIndiesSum -= m
}
for leftWindowOnes > leftNeedOnes {
if nums[leftWindowL] == 1 {
leftWindowOnes--
leftWindowOnesIndiesSum -= leftWindowL
}
leftWindowL++
}
for rightWindowOnes < rightNeedOnes && rightWindowR+1 < n {
if nums[rightWindowR+1] == 1 {
rightWindowOnes++
rightWindowOnesIndiesSum += rightWindowR + 1
}
rightWindowR++
}
if leftWindowOnes == leftNeedOnes && rightWindowOnes == rightNeedOnes {
ans = min(ans, leftAimIndiesSum-leftWindowOnesIndiesSum+rightWindowOnesIndiesSum-rightAimIndiesSum)
}
leftAimIndiesSum += m + 1 - l
rightAimIndiesSum += r - m
}
return ans
} func min(a, b int) int {
if a < b {
return a
}
return b
} func main() {
nums := []int{1, 0, 0, 1, 0, 1}
k := 2
result := minMoves(nums, k)
fmt.Println(result)
}

rust完整代码如下:

fn min_moves(nums: Vec<i32>, k: i32) -> i32 {
if k == 1 {
return 0;
}
let n = nums.len() as i32;
let x = (k - 1) / 2;
let mut left_aim_indices_sum = x * (x + 1) / 2;
let mut right_aim_indices_sum = (k - 1) * k / 2 - left_aim_indices_sum;
let mut ans = std::i32::MAX;
let (mut l, mut m, mut r) = (0, (k - 1) / 2, k - 1);
let left_need_ones = m + 1;
let (mut left_window_l, mut left_window_ones, mut left_window_ones_indices_sum) = (0, 0, 0); for i in 0..m {
if nums[i as usize] == 1 {
left_window_ones += 1;
left_window_ones_indices_sum += i as i32;
}
} let right_need_ones = k - left_need_ones;
let (mut right_window_r, mut right_window_ones, mut right_window_ones_indices_sum) = (
m,
nums[m as usize],
if nums[m as usize] == 1 { m as i32 } else { 0 },
); while r < n {
if nums[m as usize] == 1 {
left_window_ones += 1;
left_window_ones_indices_sum += m as i32;
right_window_ones -= 1;
right_window_ones_indices_sum -= m as i32;
} while left_window_ones > left_need_ones {
if nums[left_window_l] == 1 {
left_window_ones -= 1;
left_window_ones_indices_sum -= left_window_l as i32;
}
left_window_l += 1;
} while right_window_ones < right_need_ones && right_window_r + 1 < n {
if nums[(right_window_r + 1) as usize] == 1 {
right_window_ones += 1;
right_window_ones_indices_sum += (right_window_r + 1) as i32;
}
right_window_r += 1;
} if left_window_ones == left_need_ones && right_window_ones == right_need_ones {
ans = ans.min(
left_aim_indices_sum - left_window_ones_indices_sum + right_window_ones_indices_sum
- right_aim_indices_sum,
);
} left_aim_indices_sum += (m + 1 - l) as i32;
right_aim_indices_sum += (r - m) as i32; l += 1;
m += 1;
r += 1;
} ans
} fn main() {
let nums = vec![1, 0, 0, 1, 0, 1];
let k = 2;
let result = min_moves(nums, k);
println!("{}", result);
}

c++完整代码如下:

#include <iostream>
#include <vector> using namespace std; int minMoves(vector<int>& nums, int k) {
if (k == 1) {
return 0;
}
int n = nums.size();
int x = (k - 1) / 2;
int leftAimIndiesSum = x * (x + 1) / 2;
int rightAimIndiesSum = (k - 1) * k / 2 - leftAimIndiesSum;
int ans = INT_MAX;
int l = 0;
int m = (k - 1) / 2;
int r = k - 1;
int leftNeedOnes = m + 1;
int leftWindowL = 0;
int leftWindowOnes = 0;
int leftWindowOnesIndiesSum = 0;
for (int i = 0; i < m; i++) {
if (nums[i] == 1) {
leftWindowOnes++;
leftWindowOnesIndiesSum += i;
}
}
int rightNeedOnes = k - leftNeedOnes;
int rightWindowR = m;
int rightWindowOnes = nums[m];
int rightWindowOnesIndiesSum = nums[m] == 1 ? m : 0;
for (; r < n; l++, m++, r++) {
if (nums[m] == 1) {
leftWindowOnes++;
leftWindowOnesIndiesSum += m;
rightWindowOnes--;
rightWindowOnesIndiesSum -= m;
}
while (leftWindowOnes > leftNeedOnes) {
if (nums[leftWindowL] == 1) {
leftWindowOnes--;
leftWindowOnesIndiesSum -= leftWindowL;
}
leftWindowL++;
}
while (rightWindowOnes < rightNeedOnes && rightWindowR + 1 < n) {
if (nums[rightWindowR + 1] == 1) {
rightWindowOnes++;
rightWindowOnesIndiesSum += rightWindowR + 1;
}
rightWindowR++;
}
if (leftWindowOnes == leftNeedOnes && rightWindowOnes == rightNeedOnes) {
ans = min(ans,
leftAimIndiesSum - leftWindowOnesIndiesSum + rightWindowOnesIndiesSum - rightAimIndiesSum);
}
leftAimIndiesSum += m + 1 - l;
rightAimIndiesSum += r - m;
}
return ans;
} int main() {
vector<int> nums = { 1, 0, 0, 1, 0, 1 };
int k = 2;
int result = minMoves(nums, k);
cout << result << endl;
return 0;
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h> int minMoves(int* nums, int numsSize, int k) {
if (k == 1) {
return 0;
}
int x = (k - 1) / 2;
int leftAimIndiesSum = x * (x + 1) / 2;
int rightAimIndiesSum = ((k - 1) * k / 2 - leftAimIndiesSum);
int ans = INT_MAX;
int l = 0;
int m = (k - 1) / 2;
int r = k - 1;
int leftNeedOnes = m + 1;
int leftWindowL = 0;
int leftWindowOnes = 0;
int leftWindowOnesIndiesSum = 0;
for (int i = 0; i < m; i++) {
if (nums[i] == 1) {
leftWindowOnes++;
leftWindowOnesIndiesSum += i;
}
}
int rightNeedOnes = k - leftNeedOnes;
int rightWindowR = m;
int rightWindowOnes = nums[m];
int rightWindowOnesIndiesSum = nums[m] == 1 ? m : 0;
for (; r < numsSize; l++, m++, r++) {
if (nums[m] == 1) {
leftWindowOnes++;
leftWindowOnesIndiesSum += m;
rightWindowOnes--;
rightWindowOnesIndiesSum -= m;
}
while (leftWindowOnes > leftNeedOnes) {
if (nums[leftWindowL] == 1) {
leftWindowOnes--;
leftWindowOnesIndiesSum -= leftWindowL;
}
leftWindowL++;
}
while (rightWindowOnes < rightNeedOnes && rightWindowR + 1 < numsSize) {
if (nums[rightWindowR + 1] == 1) {
rightWindowOnes++;
rightWindowOnesIndiesSum += rightWindowR + 1;
}
rightWindowR++;
}
if (leftWindowOnes == leftNeedOnes && rightWindowOnes == rightNeedOnes) {
ans = min(ans, leftAimIndiesSum - leftWindowOnesIndiesSum + rightWindowOnesIndiesSum - rightAimIndiesSum);
}
leftAimIndiesSum += m + 1 - l;
rightAimIndiesSum += r - m;
}
return ans;
} int main() {
int nums[] = { 1, 0, 0, 1, 0, 1 };
int k = 2;
int numsSize = sizeof(nums) / sizeof(nums[0]);
int result = minMoves(nums, numsSize, k);
printf("%d\n", result);
return 0;
}

2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k的更多相关文章

  1. C语言入门(18)——数组与字符串

    用来存放字符量的数组称为字符数组.字符串可以看作一个数组,它的元素是字符型的. 字符数组的定义 形式与前面介绍的数值数组相同.例如: char c[10]; 由于字符型和整型通用,也可以定义为int ...

  2. C语言博客作业—字符数组

    一.PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 (1)定义i为循环变量,number用于存放每一次转化的结果,flag用于判断是否为负数,p用于修改结果的 ...

  3. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  4. Go语言:编写一个 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,返回一个 error。

    问题: 你被要求编写一个叫做 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL.如果两个 URL 在 10 秒内都未返回结果,那么应该返回一个 error ...

  5. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...

  6. 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败

    今天下午搞易语言,在编写动态链接库以后,静态编译的时候出现以下提示: 无法定位链接器!请检查 tools\link.ini 中的配置是否正确. 静态连接失败 于是网上百度了下,找到相关的解决方法: 编 ...

  7. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  8. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  9. C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  10. C语言基础 (6) 类型转换,数组与随机数

    复习 1.隐式转换 Double a Int b = 1 A = b //编译器自动转换把b转换为double类型后 再给a赋值(隐式转换) 2.强制类型转换 (变量)类型名 Int a = 1 // ...

随机推荐

  1. 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...

  2. 【2023 · CANN训练营第一季】昇腾AI入门Pytorch

    昇腾AI全栈架构 华为AI全栈全场景解决方案为4层,分别为芯片层.芯片使能层.AI框架层和应用使能层. 芯片 基于统一.可扩展架构的系列化AI IP和芯片,为上层加速提供硬件基础. 芯片产品:昇腾31 ...

  3. @Inherited元注解的使用

    @Inherited注解标记其他的注解用于指明标记的注解是可以被自动继承的. 注意:此注解只对注解标记的超类有效,对接口是无效的. 示例: 先声明两个用@Inherited标记的注解,@Name和@A ...

  4. Unity 制作KinematicCharacterController

    本篇博客为游戏开发记录,博主只是想自己做个移动组件给自己做游戏用,此间产生的一些经验也做一个分享. 简介 为了在3D世界中自由的控制我们的角色,引擎一般会提供一些基础的移动组件,上层用户做提供一些每帧 ...

  5. 实时阴影技术(Real-time Shadows)

    目录 Shadow Mapping 基本实现 Shadow Bias Peter Panning 问题 & 简单 Trick Slope Scale Based Depth Bias Casc ...

  6. Federated Learning001

    联邦学习--笔记001 2022.11.16周三 今天学习了联邦学习的开山之作---Communication-Efficient Learning of Deep Networks from Dec ...

  7. 如何快速又高质量的输出PDF实验报告?

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. PDF文档的打印在很多应用场景中都会被使用到,最为常见的就是实 ...

  8. 再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!

    在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:RestClient.用一句话来让Spring开发者认识RestClient的话:像WebClient一样具备流畅AP ...

  9. 【go语言】1.1.1 Go 语言的历史和背景

    Go 语言,也被称为 Golang,是一种静态强类型.编译型的开源编程语言.Go 语言的出现是为了解决当下的软件开发问题,特别是大规模软件系统的开发. Go 语言的设计者包括 Robert Gries ...

  10. IIC总线学习笔记

    IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板.嵌入式系统或手 ...