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. [音视频处理] FFmpeg使用指北1-视频解码

    本文将详细介绍如何使用ffmpeg 4.4在C++中解码多种格式的媒体文件,这些媒体文件可以是视频.视频流.图片,或是桌面截屏或USB摄像头的实时图片.解码文件后,还将每帧图片转换为OpenCV的Ma ...

  2. docker-compose部署django+nginx+minio

    总体文件结构 docker-compose.yml文件 version: "3" # volumes: # 自定义数据卷 networks: # 自定义网络(默认桥接) web_n ...

  3. JavaCV的摄像头实战之八:人脸检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  4. GPT3的局限性:语言多样性、语言理解能力、数据量

    目录 GPT-3 的局限性:语言多样性.语言理解能力.数据量 随着人工智能技术的不断发展,越来越多的语言模型被开发出来,其中最具代表性的就是 GPT-3.然而,尽管 GPT-3 已经在自然语言处理领域 ...

  5. 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一.前言 1.什么是poi-tl 2.官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3.poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl ...

  6. linux内核编译中常用的目标(二)

    文章目录 一. 目标 all 或者 空 二. 目标 vmlinux 三. 目标 modules 四. 目标 Image/zImage/uImage 1.Image和zImage的区别 2.uImage ...

  7. C++(类成员的访问控制)

    访问控制 如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么? struct Student { int age; int sex; void P ...

  8. 学习LVM:archive 和 backup目录

    推荐文档:Logical Volume Manager Administration 在掌握了基本的commands操作后,你是否对操作背后的一些东西产生好奇呢? 程序的configure一般会提供这 ...

  9. python教程 入门学习笔记 第2天 第一个python程序 代码规范 用默认的IDLE (Python GUI)编辑器编写

    四.第一个python程序 1.用默认的IDLE (Python GUI)编辑器编写 2.在新建文件中写代码,在初始窗口中编译运行 3.写完后保存为以.py扩展名的文件 4.按F5键执行,在初始窗口观 ...

  10. Linux中对管道命令中的任意子命令进行返回码校验

    ~~ linux return code with pipeline~~ ~~ linux 管道命令中的返回码~~ BASH SHELL中,通常使用 $? 来获取上一条命令的返回码. Shell Sc ...