首页 > 其他分享 >2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1。 Alice可以选择任何索引 aliceIndex

2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1。 Alice可以选择任何索引 aliceIndex

时间:2024-10-13 19:59:15浏览次数:1  
标签:maxChanges nums Alice 拾取 int64 go left

2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n,

目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1。

Alice可以选择任何索引 aliceIndex,如果对应的 nums[aliceIndex] 是1,Alice会拾取一个1并将其设为0。

之后,Alice可以选择以下两种行动之一:

将一个0变为1(最多执行 maxChanges 次),或交换相邻的两个数(一个是1,一个是0)。

返回拾取 k 个1 所需的最少行动次数。

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

输出:3。

解释:如果游戏开始时 Alice 在 aliceIndex == 1 的位置上,按照以下步骤执行每个动作,他可以利用 3 次行动拾取 3 个 1 :

游戏开始时 Alice 拾取了一个 1 ,nums[1] 变成了 0。此时 nums 变为 [1,0,0,0,0,1,1,0,0,1] 。

选择 j == 2 并执行第一种类型的动作。nums 变为 [1,0,1,0,0,1,1,0,0,1]

选择 x == 2 和 y == 1 ,并执行第二种类型的动作。nums 变为 [1,1,0,0,0,1,1,0,0,1] 。由于 y == aliceIndex,Alice 拾取了一个 1 ,nums 变为 [1,0,0,0,0,1,1,0,0,1] 。

选择 x == 0 和 y == 1 ,并执行第二种类型的动作。nums 变为 [0,1,0,0,0,1,1,0,0,1] 。由于 y == aliceIndex,Alice 拾取了一个 1 ,nums 变为 [0,0,0,0,0,1,1,0,0,1] 。

请注意,Alice 也可能执行其他的 3 次行动序列达成拾取 3 个 1 。

答案2024-10-13:

chatgpt

题目来自leetcode3086。

大体步骤如下:

1.首先定义了一个辅助函数 f(i) 用来计算索引 i 周围的数之和(包括自身)。

2.在主函数 minimumMoves 中,采用双指针的方法来实现解题的逻辑。

3.初始化左右指针 left, right 为 0,-1,左右两侧和左右两侧计数和求和 leftCount, rightCount, leftSum, rightSum 都初始化为 0。

4.定义变量 res 为 int64 类型的最大值 math.MaxInt64。

5.遍历数组 nums 中每个元素,依次判断条件:

  • 如果 f(i) + maxChanges 大于等于 k,则执行下面的逻辑。

  • 比较 k 和 f(i) 的大小,选择取的数为 k 还是 f(i)。

  • 如果 k 小于等于 maxChanges,则继续遍历下一个数。

6.进入双指针逻辑的循环:

  • 循环直到右指针 right 指向的位置和左指针 left 之间的距离小于等于左指针和 i 之间的距离,且左右两侧数量之和小于 k。

  • 若右指针指向的数为 1,则将右侧计数、和增加。

7.接下来在一个 while 循环内调整左右指针位置,使得左右两侧数量之和不超过 k。

8.对于每一次循环,计算当前情况下拾取 k 个 1 所需的最少行动次数,并更新 res。

9.最后在循环中,对左右计数、和进行一系列调整。

10.返回 res 作为最终结果。

总的时间复杂度:

  • 整体是两个循环的嵌套,外部循环遍历数组中的每个元素,内部循环是双指针逻辑,所以时间复杂度是 O(n^2)。

总的额外空间复杂度:

  • 只使用了一些常量级别的额外空间来存储几个变量,所以额外空间复杂度是 O(1)。

Go完整代码如下:

package main

import (
	"fmt"
	"math"
)

func minimumMoves(nums []int, k int, maxChanges int) int64 {
	n := len(nums)
	f := func(i int) int {
		x := nums[i]
		if i-1 >= 0 {
			x += nums[i-1]
		}
		if i+1 < n {
			x += nums[i+1]
		}
		return x
	}

	left, right := 0, -1
	leftSum, rightSum := int64(0), int64(0)
	leftCount, rightCount := int64(0), int64(0)
	var res int64 = math.MaxInt64
	for i := 0; i < n; i++ {
		if f(i)+maxChanges >= k {
			if k <= f(i) {
				res = min(res, int64(k-nums[i]))
			} else {
				res = min(res, int64(2*k-f(i)-nums[i]))
			}
		}
		if k <= maxChanges {
			continue
		}
		for right+1 < n && (right-i < i-left || leftCount+rightCount+int64(maxChanges) < int64(k)) {
			if nums[right+1] == 1 {
				rightCount++
				rightSum += int64(right) + 1
			}
			right++
		}
		for leftCount+rightCount+int64(maxChanges) > int64(k) {
			if right-i < i-left || right-i == i-left && nums[left] == 1 {
				if nums[left] == 1 {
					leftCount--
					leftSum -= int64(left)
				}
				left++
			} else {
				if nums[right] == 1 {
					rightCount--
					rightSum -= int64(right)
				}
				right--
			}
		}
		res = min(res, leftCount*int64(i)-leftSum+rightSum-rightCount*int64(i)+2*int64(maxChanges))
		if nums[i] == 1 {
			leftCount++
			leftSum += int64(i)
			rightCount--
			rightSum -= int64(i)
		}
	}
	return res
}

func main() {
	nums := []int{1, 1, 0, 0, 0, 1, 1, 0, 0, 1}
	k := 3
	maxChanges := 1
	fmt.Println(minimumMoves(nums, k, maxChanges))
}

在这里插入图片描述

标签:maxChanges,nums,Alice,拾取,int64,go,left
From: https://www.cnblogs.com/moonfdd/p/18462863

相关文章

  • 公司订餐系统小程序(Python+Django+lw+系统源码 +调试)
    摘  要随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,菜品信息展现了其蓬勃生命力和广阔的前景。与此同时,为解决用户需求,教室预约发展愈发多元化与网络化,与电子信......
  • 【开题报告】基于django+vue敬老院管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,敬老院作为老年人生活照护的重要场所,其管理效率和服务质量日益受到关注。传统的敬老院管理模式往往......
  • PyTorchStepByStep - Chapter 2.1: Going Classy
     classStepByStep():def__init__(self,model,loss_fn,optimizer):self.device='cuda'iftorch.cuda.is_available()else'cpu'self.model=model.to(self.device)self.loss_fn=loss_fnself.opti......
  • golang实现分段协程数据查询、任务处理
    使用背景我们经常遇到需要同时执行耗时的IO请求或数据处理等场景,需要用到协程来达到高效率,但又需要控制协程执行过程的量,防止资源过载,让效率和资源达到最优状态,这就是分段执行的价值。一般实现的方式主要有两种:1、需要获取执行结果,在协程内将执行结果写入chan,并在分段创......
  • Go 语言中的数组使用
    Go语言中的数组使用本文将详细介绍Go语言中数组的各种用法,包括数组声明和定义、多维数组的使用和遍历,以及数组的值传递等初级、中级和高级用法。数组声明定义的几种方式初级用法介绍Go中的数组是一种固定长度、元素类型相同的数据结构,适用于简单的数据存储场景。......
  • golang从http请求中读取xml格式的body,并转成json
    推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录以下是在Go语言中从HTT......
  • 分享我的Nvim Go语言配置文件
    细节参考我的另一篇文章(C++那篇)需要配置好Go语言的环境变量(可参考https://learnku.com/articles/24924)callplug#begin('~/.config/nvim/plugged')Plug'preservim/nerdtree'Plug'majutsushi/tagbar'Plug'Xuyuanp/nerdtree-git-plugin'Plug'......
  • 【开题报告】基于django+vue快递仓库管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和物流行业的快速增长,快递仓库的管理变得日益复杂和关键。传统的仓库管理方式已经难以满足当前高效、精准的管理需......
  • golong下载
    https://www.cnblogs.com/se6c/p/17890974.html#gallery-2目录中文网官网编译器下载额外步骤:加速访问配置GOPROXY环境变量,以下三选一给你们看下我的这一步步骤(我选的阿里)中文网首页-Go语言中文网-Golang中文社区官网TheGoProgrammingLanguage编译器下载1.我......
  • 【开题报告】基于django+vue猫咪咖啡馆管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在数字化转型的大潮中,各类商业实体纷纷寻求通过信息化手段提升运营效率与用户体验。猫咪咖啡馆作为一种结合了咖啡文化与宠物互动的创意经......