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

2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操的更多相关文章
- Python算法每日一题--001--给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
- Leecode刷题之旅-C语言/python-1.两数之和
开学后忙的焦头烂额(懒得很),正式开始刷leecode的题目了. 想了想c语言是最最基础的语言,虽然有很多其他语言很简单,有更多的函数可以用,但c语言能煅炼下自己的思考能力.python则是最流行的语 ...
- C语言实现两数相加2018-09-23
/*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...
- 2019-6-27-WPF-如何给定两个点画出一条波浪线
title author date CreateTime categories WPF 如何给定两个点画出一条波浪线 lindexi 2019-6-27 10:17:6 +0800 2019-6-26 ...
- 解了这14道C语言谜题后,所有人都失声了!我来带你深入了解C!
本文展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让 ...
- 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码
正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.u ...
- C# 语言的两个html解析器
基于C# 语言的两个html解析器 基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...
- 基于C# 语言的两个html解析器
基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组
题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
随机推荐
- 一些自托管(self hosted)服务的使用笔记
opengrok oracle的opengrok是一个项目代码查找工具,自建索引,类似工具有source insight 官方已经提供好了docker镜像,傻瓜式安装.不过增加新的项目源码时需要手动更 ...
- socket 端口复用 SO_REUSEPORT 与 SO_REUSEADDR
背景 在学习 SO_REUSEADDR 地址复用的时候,看到有人提到了 SO_REUSEPORT .于是也了解了一下. SO_REUSEPORT 概述 SO_REUSEPOR这个socket选项可以让 ...
- 记一次难忘的json反序列化问题排查经历
前言 最近我在做知识星球中的商品秒杀系统,昨天遇到了一个诡异的json反序列化问题,感觉挺有意思的,现在拿出来跟大家一起分享一下,希望对你会有所帮助. 案发现场 我最近在做知识星球中的商品秒杀系统,写 ...
- 从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权
在Web应用程序中,安全性是一个至关重要的方面.Spring Security是Spring框架的一个子项目,用于提供安全访问控制的功能.通过集成Spring Security,我们可以轻松实现用户认 ...
- VulnHub_DC-6渗透流程
DC-6 kali:192.168.157.131 靶机:192.168.157.150 修改host文件,添加192.168.157.150 wordy不然解析不了域名 信息收集 发现是WordPr ...
- SpringBoot配置Mysql连接池
一.HikariCP连接池 SpringBoot默认使用连接池HikariCP,不需要依赖. spring: datasource: driver-class-name: com.mysql.cj.j ...
- Django4全栈进阶之路24 项目实战(报修类型表):CKEditor富文本
CKEditor是一个强大的富文本编辑器,可以用于在网站或应用程序中创建和编辑内容.以下是在安装和使用CKEditor的一般步骤: 安装CKEditor: 下载CKEditor:访问CKEditor官 ...
- JDBC第二天:防sql攻击
1 什么是SQL攻击 在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语 ...
- nginx的一些功能
一.四层(tcp/udp)代理 由于nginx默认是不支持四层代理的因此在安装的时候需要加上对应的模块with-stream ./configure --with-stream # 查看当前nginx ...
- systempath:Python开发者必备的文件与系统路径操作神器!
systempath - 专业级的文件与系统路径操作库 English | 中文 systempath 是一个专为Python开发者设计的,高度专业化的文件与系统路径操作库.通过提供一套直观且功能强大 ...