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

news/2024/10/13 20:13:52

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 mainimport ("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, -1leftSum, rightSum := int64(0), int64(0)leftCount, rightCount := int64(0), int64(0)var res int64 = math.MaxInt64for 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 := 3maxChanges := 1fmt.Println(minimumMoves(nums, k, maxChanges))
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

c++实验1

实验1:// 现代C++标准库、算法库体验 // 本例用到以下内容: // 1. 字符串string, 动态数组容器类vector、迭代器 // 2. 算法库:反转元素次序、旋转元素 // 3. 函数模板、const引用作为形参#include <iostream> #include <string> #include <vector> #inclu…

WINCC7.5SP2报表练习1-增加大量数据记录,报表查询、快速导出查询结果

这是分成两篇记录的学习笔记,这是第一篇,在新浪博客刚刚记录过,那边审查有点慢,时不时还会莫名其妙的清零,在这里也记录一次。 最近现场提出要做报表功能,数据来自两种控制系统,施耐德M580和ABB AC900F,我不想在每一套控制系统上各做报表,加上ABB AC900F的上位机freel…

seata 模式相关

Seata解决分布式的方案 1AT模式 数据最终一致 AT模式使用起来更加简单,无业务侵入,性能更好 AT 模式是 Seata 创新的一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSource…

基于VL812芯片的USB 3.0Hub设计

前言(设计初衷) 由于自己笔记本插接口不多,在网上购买了一款USB扩展坞,但平时要往返宿舍和工位,书包要放课本、笔记本等,不想再增加重量就动手搞一个放工位上方便。自己动手,丰衣足食(哈哈哈哈其实是自己不想包里放太多东西,同时也想练练画板),接下来就开始进入我们…

LLM中词向量的表示和词嵌入的一些疑问

LLM中词向量的表示和词嵌入的一些疑问 词向量的一些特点 在3blue1brown的视频【官方双语】GPT是什么?直观解释Transformer | 深度学习第5章_哔哩哔哩_bilibili中, 在15min左右介绍了LLM的词嵌入的过程. 其中提到mother的词向量减去father的词向量, 会近似于women的词向量-man的…

2024-2025-1 20241304 《计算机基础与程序设计》第3周学习总结

2024-2025-1 20241304 《计算机基础与程序设计》第3周学习总结 作业信息这个作业属于哪个课程 <[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP>)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK0…

DrawPad 离线注册

DrawPad 离线注册 目录DrawPad 离线注册reg_dialog_549414parpms==>callbackreg_5486C3do_reg_5489A4check_key_547842calc_idkey_54AB37calc_54A9A5transform_54A8FFpy 仅分析离线注册,联网时注册会有网络校验regcheck reg_dialog_549414 定位注册对话框 char __stdcall…

2024-2025-1 20241415 《计算机基础与程序设计》第三周学习总结

2024-2025-1 20241415 《计算机基础与程序设计》第三周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <温习巩固本…