首页 > 其他分享 >2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操

2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操

时间:2024-08-14 10:53:21浏览次数:15  
标签:下标 标记 int nums IntSlice go changeIndices

2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。

从第1秒到第m秒,每秒可以选择以下四种操作之一:

1.选择范围 [1, n] 中一个下标 i,将nums[i]减少1。

2.将nums[changeIndices[s]]设为任意非负整数。

3.选择范围 [1, n] 中一个下标 i,标记满足nums[i]为0的下标i。

4.不执行任何操作。

任务是找到最早的秒数(在范围 [1, m] 中),在这个秒数下执行最佳操作后,能够标记所有下标。如果无法标记所有下标,返回-1。

输入:nums = [3,2,3], changeIndices = [1,3,2,2,2,2,3]。

输出:6。

解释:这个例子中,我们总共有 7 秒。按照以下操作标记所有下标:

第 1 秒:将 nums[changeIndices[1]] 变为 0 。nums 变为 [0,2,3] 。

第 2 秒:将 nums[changeIndices[2]] 变为 0 。nums 变为 [0,2,0] 。

第 3 秒:将 nums[changeIndices[3]] 变为 0 。nums 变为 [0,0,0] 。

第 4 秒:标记下标 1 ,因为 nums[1] 等于 0 。

第 5 秒:标记下标 2 ,因为 nums[2] 等于 0 。

第 6 秒:标记下标 3 ,因为 nums[3] 等于 0 。

现在所有下标已被标记。

最早可以在第 6 秒标记所有下标。

所以答案是 6 。

答案2024-08-14:

chatgpt

题目来自leetcode3049。

大体步骤如下:

1.初始化总秒数为数组 nums 的长度 n,并遍历 nums 计算出总共需要的天数 total(慢速复习 + 考试)。

2.创建一个数组 firstT,用于记录每个索引对应的首次变化的时间(从 m 开始往前)。

3.初始化堆 h,并利用 sort.Search 函数找到最小的秒数 ans,使得满足能够标记所有下标。

4.在排序后的时间线上依次进行操作,首先检查是否需要继续慢速复习或考试,然后根据条件进行相应的操作,更新堆 h 并维护慢速复习天数以及快速复习(堆中的元素)。

5.如果所有下标被标记,则返回最早秒数 ans;否则返回 -1。

总的时间复杂度为 O(m log m)(sort.Search 的二分查找)+ O(m)(遍历整个时间线)= O(m log m)

总的额外空间复杂度为 O(m)(堆 h 的存储空间)。

go完整代码如下:

package main

import (
	"container/heap"
	"fmt"
	"sort"
)

func earliestSecondToMarkIndices(nums, changeIndices []int) int {
	n, m := len(nums), len(changeIndices)
	if n > m {
		return -1
	}

	total := n
	for _, v := range nums {
		total += v // 慢速复习+考试所需天数
	}

	firstT := make([]int, n)
	for t := m - 1; t >= 0; t-- {
		firstT[changeIndices[t]-1] = t + 1
	}

	h := hp{}
	ans := n + sort.Search(m+1-n, func(mx int) bool {
		mx += n
		cnt, slow := 0, total
		h.IntSlice = h.IntSlice[:0]
		for t := mx - 1; t >= 0; t-- {
			i := changeIndices[t] - 1
			v := nums[i]
			if v <= 1 || t != firstT[i]-1 {
				cnt++ // 留给左边,用来快速复习/考试
				continue
			}
			if cnt == 0 {
				if h.Len() == 0 || v <= h.IntSlice[0] {
					cnt++ // 留给左边,用来快速复习/考试
					continue
				}
				slow += heap.Pop(&h).(int) + 1
				cnt += 2 // 反悔:一天快速复习,一天考试
			}
			slow -= v + 1
			cnt-- // 快速复习,然后消耗一天来考试
			heap.Push(&h, v)
		}
		return cnt >= slow // 剩余天数搞定慢速复习+考试
	})
	if ans > m {
		return -1
	}
	return ans
}

type hp struct{ sort.IntSlice }

func (h *hp) Push(v any) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() any   { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v }

func main() {
	nums := []int{3, 2, 3}
	changeIndices := []int{1, 3, 2, 2, 2, 2, 3}
	fmt.Println(earliestSecondToMarkIndices(nums, changeIndices))
}

在这里插入图片描述

标签:下标,标记,int,nums,IntSlice,go,changeIndices
From: https://www.cnblogs.com/moonfdd/p/18358410

相关文章

  • Mac下go安装
      https://go.dev/dl/查看是arm64,还是x86-64命令:-uname-a我的是DarwinokerdeMacBook-Pro.local23.5.0DarwinKernelVersion23.5.0:WedMay 120:13:18PDT2024;root:xnu-10063.121.3~5/RELEASE_ARM64_T6030arm64  安装后,重新打开终端  输入命令:go......
  • 【Django开发】django美多商城项目完整开发4.0第2篇:项目准备【附代码文档】
    本教程的知识点为:美多商城项目准备项目准备配置1.修改settings/dev.py文件中的路径信息2.INSTALLED_APPS3.数据库用户部分图片验证码1.后端接口设计:视图原型2.具体视图实现用户部分使用Celery完成发送短信判断帐号是否存在1.判断用户名是否存在后端接口设......
  • Google和Microsoft Edge网页插件推荐(附获取方法)
    1.插件获取方式MicrosoftEdge:找到拓展图标,点击获取MicrosoftEdge扩展:Google:在Google网页右上角找到Extensions图标,选择Manageextensions在Manageextensions中选择ChromeWebStore,打开插件商店界面。在商店搜素栏即可查询自己需要的插件。在下载插件之后,点击右......
  • 题解:CF1957A Stickogon
    原地址:这里思路首先看样例41121162233339422224244首先可以肯定当\(t\)为\(1\)和\(2\)时不能组成多边形,易知要组成最多的多边形,三角形更有性价比,观察样例\(t\)为\(6\)可以发现,只要用相同的木棍除以\(3\)取整便是答案,可能会有人问了,那我用......
  • Django-rest-framework(DRF)怎么使用celery
    目录一、什么是celery1、celery简介2、celery的使用场景3、celery的架构二、Django使用celery1、安装celery2、Django配置三、定时任务和异步任务一、什么是celery1、celery简介Celery是一个基于Python开发的分布式异步消息任务队列,它专注于实时处理的异步任务队......
  • Golang - goto语句
    用途可以无条件地转移到过程中指定的行。该语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。语法gotolabel;...label:statement;注意:作用域......
  • golang 管道channel相关问题
    一funcmain(){ c1:=make(chanany) <-c1}上面代码运行肯定会报deadlock的死锁错误,但是下面这样,如果有一个协程一直在运行,则不会报错,大致就是因为协程还在运行,所属主协程main不确定是否会往管道c1中写数据,所以就会一直阻塞在这里,上面的代码块或者没有一直执行的协程......
  • polygon-cdk代码解读
    同步器数据的查找数据来源:数据是从以太坊L1区块链(L1)中获取的。通过多个以太坊客户端(ethermans)并行地请求获取区块数据。查找数据的函数:asyncRequestRollupInfoByBlockRange:异步请求特定区块范围内的汇总信息(rollupinfo)。requestLastBlockWithRetries:重......
  • 基于django+vue基于单片机及spring框架的高血压患者居家监测系统【开题报告+程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着人口老龄化的加剧和生活方式的改变,高血压已成为全球范围内最常见的慢性疾病之一,其高发病率和并发症的严重性对公共健康构成了严重威胁......
  • 基于django+vue基于宠物服务系统的设计与实现【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人们对生活品质要求的提高,宠物已成为许多家庭不可或缺的一员,它们不仅为人们的生活带来了乐趣与陪伴,还承载着情感......