2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p ,

它们表示一个长度为 n 且下标从 0 开始的数组 arr ,

数组中除了下标为 p 处是 1 以外,其他所有数都是 0 。

同时给你一个整数数组 banned ,它包含数组中的一些位置。

banned 中第 i 个位置表示 arr[banned[i]] = 0 ,题目保证 banned[i] != p 。

你可以对 arr 进行 若干次 操作。一次操作中,你选择大小为 k 的一个 子数组

并将它 翻转 。在任何一次翻转操作后,

你都需要确保 arr 中唯一的 1 不会到达任何 banned 中的位置。

换句话说,arr[banned[i]] 始终 保持 0 。

请你返回一个数组 ans ,对于 [0, n - 1] 之间的任意下标 i ,

ans[i] 是将 1 放到位置 i 处的 最少 翻转操作次数,

如果无法放到位置 i 处,此数为 -1 。

子数组 指的是一个数组里一段连续 非空 的元素序列。

对于所有的 i ,ans[i] 相互之间独立计算。

将一个数组中的元素 翻转 指的是将数组中的值变成 相反顺序 。

输入:n = 4, p = 0, banned = [1,2], k = 4。

输出:[0,-1,-1,1]。

来自左程云

答案2023-09-16:

步骤如下:

1.创建一个奇数集合(oddSet)和一个偶数集合(evenSet)。

2.将所有奇数(除了p和banned中的位置)添加到oddSet中。

3.将所有偶数(除了p和banned中的位置)添加到evenSet中。

4.创建一个长度为n的数组ans,初始化全部为-1。

5.创建一个队列queue和两个指针l和r,初始化r=0。

6.将p放入队列queue中,r加1。

7.初始化level=0。

8.当l < r时,执行以下步骤:

  • 取出队列头部元素cur。

  • 将level赋值给ans[cur]。

  • 计算cur左边和右边的范围,分别为left和right。

  • 根据left的奇偶性,选择对应的集合curSet(如果left是偶数,则curSet为evenSet;否则为oddSet)。

  • 在curSet中查找大于等于left的最小元素,并将其加入队列queue中,r加1。

  • 从curSet中移除该元素。

  • 重复以上步骤,直到curSet中没有大于等于left的元素。

  • l加1。

9.更新level,重复步骤8直到l < r不成立。

10.返回ans。

时间复杂度:假设n为数组长度,遍历数组需要O(n)的时间复杂度,每次操作需要在集合中查找和移除元素,集合的查找和移除操作的时间复杂度为O(log n)。总体时间复杂度为O(n log n)。

空间复杂度:创建两个集合,集合的空间复杂度为O(n),创建一个队列,队列的空间复杂度为O(n),创建一个数组,数组的空间复杂度为O(n),总体空间复杂度为O(n)。

go完整代码如下:

package main

import (
"fmt" "github.com/emirpasic/gods/sets/treeset"
) func minReverseOperations(n int, p int, banned []int, k int) []int {
oddSet := treeset.NewWithIntComparator()
evenSet := treeset.NewWithIntComparator() for i := 1; i < n; i += 2 {
oddSet.Add(i)
}
for i := 0; i < n; i += 2 {
evenSet.Add(i)
} for _, ban := range banned {
oddSet.Remove(ban)
evenSet.Remove(ban)
} oddSet.Remove(p)
evenSet.Remove(p) ans := make([]int, n)
for i := range ans {
ans[i] = -1
} queue := make([]int, n)
l := 0
r := 0
queue[r] = p
r++ level := 0
for l < r {
end := r
for l < end {
cur := queue[l]
ans[cur] = level left := max(cur-k+1, k-cur-1)
right := min(cur+k-1, n*2-k-cur-1) curSet := oddSet
if (left & 1) == 0 {
curSet = evenSet
} _, ceiling := curSet.Find(func(index int, value interface{}) bool {
if value.(int) >= left {
return true
} else {
return false
}
}) for ceiling != nil && ceiling.(int) <= right {
queue[r] = ceiling.(int)
r++
curSet.Remove(ceiling)
_, ceiling = curSet.Find(func(index int, value interface{}) bool {
if value.(int) >= left {
return true
} else {
return false
}
})
} l++
}
level++
} return ans
} func max(a, b int) int {
if a > b {
return a
}
return b
} func min(a, b int) int {
if a < b {
return a
}
return b
} func main() {
n := 4
p := 0
banned := []int{1, 2}
k := 4 result := minReverseOperations(n, p, banned, k)
fmt.Println(result)
}

2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示一个长度为 n 且下标从 0 开始的数组 arr , 数组中除了下标为 p 处是 1的更多相关文章

  1. iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解

    目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...

  2. 键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...

    一.有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标 ...

  3. js javascript 如何获取某个值在数组中的下标

    js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...

  4. 6.7-3将数组arr中索引值为2的元素替换为“bb”

    package shuzu; import java.util.Arrays; public class TH { public static void main(String[] args) { / ...

  5. js在数组arr中随机获取count数量的元素

    // 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...

  6. 计算数组arr中所有元素的和

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的

    Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...

  8. PHP 面试题数组篇[ 整理中 ]

    网上找的PHP数组题,准备自己做一遍并且记录下来.不断添加中. 1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. <?php function arrsort($first, ...

  9. c语言中数组,指针数组,数组指针,二维数组指针

    1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...

  10. javascript在数组的循环中删除元素

    在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...

随机推荐

  1. UART-UART非常见波特率调试应用笔记

    UART非常见波特率调试 应用笔记 串口通信中的波特率选择,对于确保可靠的数据传输至关重要.波特率是衡量单位时间内传输的比特数,常见的波特率包括300.1200.2400.9600.115200等.不 ...

  2. MySQL uuid及其相关的一些简单性能测试

    运维同事导入一批大约500万左右的数据,耗时较久.他使用的是纯SQL导入,主键使用的是UUID,因为业务原因没有使用自增ID. 因为是内网,不能远程访问. 通过沟通,大致觉得有两个原因,一是因为UUI ...

  3. Vue——前端发展史、Vue介绍和使用、插值语法、文本指令、事件指令

    前端的发展史 # 1 HTML(5).CSS(3).JavaScript(ES5.ES6):编写一个个的页面 -> 给后端(PHP.Python.Go.Java) -> 后端嵌入模板语法 ...

  4. 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板

    最近得空学习了下uniapp结合vue3搭建跨端项目.之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发.随着vite.js破局出圈,越来越多的项目偏向于vue3开 ...

  5. 【python基础】类-初识类

    1.面向对象思想 在认识类之前,我们需要理解面向对象思想和面向过程思想. 面向过程思想:要拥有一间房屋,面向过程像是自己来修盖房屋,如果需要经过选址.购买材料.砌墙.装修等步骤,面向过程编程,就相当于 ...

  6. Paimon读取流程

    查询模式 先来看看官网关于Paimon查询模式的说明 可以看到查询模式围绕snapshot展开, 而snapshot分了两种一种是Last compact snapshot和 last snapsho ...

  7. LocalTime转String类型,如下图

  8. Pychrm自定义代码块

    Pycharm -> Perferences (command + ,)

  9. Excel 进度图表制作

    Excel 改变图标的形状 最终效果 过程有点杂乱,不再重新整理,基本照着下面的设就完事了. 未完成的想用柱型,和已完成的相结合 右击,更改表类型 选择簇状柱形图.次标轴 注意主.次坐标 进度改为折线 ...

  10. 基于GPT搭建私有知识库聊天机器人(三)向量数据训练

    在前面的文章中,我们介绍了实现原理和基本环境安装.本文将重点介绍数据训练的流程,以及如何加载.切割.训练数据,并使用向量数据库Milvus进行数据存储. 1. 数据训练依赖于向量数据库 在本文中,我们 ...