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))
}

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

  1. Python算法每日一题--001--给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  2. Leecode刷题之旅-C语言/python-1.两数之和

    开学后忙的焦头烂额(懒得很),正式开始刷leecode的题目了. 想了想c语言是最最基础的语言,虽然有很多其他语言很简单,有更多的函数可以用,但c语言能煅炼下自己的思考能力.python则是最流行的语 ...

  3. C语言实现两数相加2018-09-23

    /*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...

  4. 2019-6-27-WPF-如何给定两个点画出一条波浪线

    title author date CreateTime categories WPF 如何给定两个点画出一条波浪线 lindexi 2019-6-27 10:17:6 +0800 2019-6-26 ...

  5. 解了这14道C语言谜题后,所有人都失声了!我来带你深入了解C!

    本文展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言. 如果你不看答案,不知道是否有把握回答各个谜题?让 ...

  6. 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

    正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.u ...

  7. C# 语言的两个html解析器

    基于C# 语言的两个html解析器   基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...

  8. 基于C# 语言的两个html解析器

    基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...

  9. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  10. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

随机推荐

  1. python 方法调用另一个方法报错,捕获的异常只有message,优化为trackback捕获详细的报错信息

    A方法加了try...expect... B方法也加了try....expect... B方法调用了A方法,A方法查找元素,找不到报超时异常,实际B捕获到的异常,只有message\n,没有办法看出是 ...

  2. 实验7.Vlan划分实验

    # 实验7.Vlan划分实验 本实验用于划分Vlan,并对划分的Vlan做隔离测试. 实验组 拓扑 Vlan隔离配置 在配置vlan前,测试PC1234互通 具体配置vlan 这里给出其中一台交换机的 ...

  3. 关于c指针的理解

    1 #include<stdio.h> 2 { 3 int a= 100,b=10; 4 int *p1=&a,*p2=&b; 5 *p1=b; 6 *p2=a; 7 pr ...

  4. 高通lk:配置与使用i2c

    高通lk:配置与使用i2c 以msm8909为例. 背景 在lk中要去驱动一个aw9523的ic来控制指示灯. 但是现在对应的i2c没有打开.因此需要进行处理. 步骤 找到I2C对应的ID与句柄 参考 ...

  5. uniapp+thinkphp5实现微信登录

    前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程. 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https:// ...

  6. 算法金 | Transformer,一个神奇的算法模型!!

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在现代自然语言处理(NLP)领域,Transformer 模型的出现带 ...

  7. 嵌入式HLS 案例开发手册——基于Zynq-7010/20工业开发板(2)

    目 录 2 led_flash 案例 19 2.1 HLS 工程说明 19 2.2 编译与仿真 20 2.3 IP 核测试 23 3 key_led_demo 案例 23 3.1 HLS 工程说明 2 ...

  8. logo3

  9. Python脚本报错:DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working import pymssql

    报错信息: monitor_mssql.py:10: DeprecationWarning: Using or importing the ABCs from 'collections' instea ...

  10. JavaScript -- 变量 --手稿