2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示一个长度为 n 且下标从 0 开始的数组 arr , 数组中除了下标为 p 处是 1
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的更多相关文章
- iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解
目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...
- 键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...
一.有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标 ...
- js javascript 如何获取某个值在数组中的下标
js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...
- 6.7-3将数组arr中索引值为2的元素替换为“bb”
package shuzu; import java.util.Arrays; public class TH { public static void main(String[] args) { / ...
- js在数组arr中随机获取count数量的元素
// 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...
- 计算数组arr中所有元素的和
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的
Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...
- PHP 面试题数组篇[ 整理中 ]
网上找的PHP数组题,准备自己做一遍并且记录下来.不断添加中. 1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. <?php function arrsort($first, ...
- c语言中数组,指针数组,数组指针,二维数组指针
1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...
- javascript在数组的循环中删除元素
在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...
随机推荐
- rest --framework 源码学习第一天 view 类
首先view类:源码分析
- SQL Server 2008/2012 完整数据库备份+差异备份+事务日志备份 数据库完整还原(一)
还原方案 数据库级(数据库完整还原) 还原和恢复整个数据库.数据库在还原和恢复操作期间会处于离线状态.SQL SERVER不允许用户备份或还原单个表.还原方案是指从一个或多个备份中还原数据.继而恢复数 ...
- 自然语言处理 Paddle NLP - 预训练语言模型及应用
什么是语言理解? 关于疫情的一段对话: 中国:我们这边快完了 欧洲:我们这边快完了 中国:我们好多了 欧洲:我们好多了 挑战: 语言的复杂性和多样性 多义/同义/歧义现象 灵活多变的表达形式 语言背后 ...
- 前端vue 宫格组件提供常见九宫格菜单组件,扩充性好,可切换九宫格 十二宫格 十五宫格
快速实现vue uni-app宫格组件提供常见九宫格菜单组件,扩充性好,可切换九宫格 十二宫格 十五宫格; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net. ...
- IOS开发--UILabel的基本使用
UILabel是iOS中用于显示静态文本的控件. 它的主要功能是:1. 显示一行或多行文本 UILabel可以用来显示单行或多行文本内容.通过设置numberOfLines属性可以控制文本显示的行数. ...
- redis集群报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.
之前在x86架构的服务器部署redis集群,未遇到题中问题:然而在ARM架构的服务器部署redis集群,第一次遇到如此问题.虽然问题已经解决,但不清楚问题的具体原因,在此做个记录. 性能测试过程中,通 ...
- SQL Sever 基础语法(增)
SQL Sever 插入(Insert)基础语法详解 在SQL中,向表中插入数据是最基础的,任何对数据处理的基础就是数据库有数据,对于SQL而言,向表中插入数据有多种方法,本文列举3种: (一) 标 ...
- 完全兼容DynamoDB协议!GaussDB(for Cassandra)为NoSQL注入新活力
摘要:DynamoDB是一款托管式的NoSQL数据库服务,支持多种数据模型,广泛应用于电商.社交媒体.游戏.IoT等场景. 本文分享自华为云社区<完全兼容DynamoDB协议!GaussDB(f ...
- Spring Boot 整合组件套路
自动配置类 Spring Boot 在整合任何一个组件的时候都会先添加一个依赖 starter,比如整合 MybatisPlus 有一个 mybatis-plus-boot-starter,如下: & ...
- 《Effective C++ 改善程序与设计的55个具体做法》读书笔记
1 .让自己习惯C++ 条款01 视C++为一个语言联邦 C Object-Oriented C++ Template C++ STL C++高效编程守则视情况而变化,取决于你使用C++的哪一部分. ...