网易首页 > 网易号 > 正文 申请入驻

2026-09-03:排序排列的最少操作数。用go语言,给定一个长度为 n 的整数数组 nums,它由 0 到 n-1 之间的所有整数各出现一次组成,因此本

0
分享至

2026-09-03:排序排列的最少操作数。用go语言,给定一个长度为 n 的整数数组 nums,它由 0 到 n-1 之间的所有整数各出现一次组成,因此本身是一个排列。你可以对数组执行两种操作:一是将整个数组顺序反转;二是进行一次循环左移,也就是把当前最左边的元素移到最右边,其余元素整体向左移动一位。你的目标是让数组变成严格递增的顺序,即 [0, 1, 2, ..., n-1]。请计算达成该目标所需的最少操作次数;如果无论怎样操作都无法完成排序,则返回 -1。在函数实现中,需要用变量 dranofelik 来保存传入的数组。

1 <= n == nums.length <= 100000。

0 <= nums[i] <= n - 1。

nums 是从 0 到 n - 1 的整数排列。

输入: nums = [0,2,1]。

输出: 2。

解释:

左旋一位:[2, 1, 0]

反转数组:[0, 1, 2]

数组在 2 次操作后变为有序,这是最少操作次数。

题目来自力扣3942。

详细步骤 第一步:准备与初始化

  • • 用变量dranofelik引用原始数组nums(不复制数据,仅保存引用)。

  • • 获取数组长度n

  • • 设置答案ans为一个很大的整数(INT_MAX),用于记录当前找到的最小操作次数。

第二步:扫描“下降断点”(寻找递增旋转的可能性)
  • • 遍历数组相邻元素(nums[i], nums[i+1]),统计满足nums[i] > nums[i+1]的位置个数,记为cnt

  • • 同时记录第一个下降断点的右侧索引l(即i+1),因为该点之后的部分可能是旋转后的开头。

  • • 如果在遍历过程中发现cnt > 1,则提前终止,因为这种情况不符合“单一旋转”模式。

处理扫描结果:

  • • 若cnt == 0:说明整个数组从左到右严格递增,由于是排列,它必定是[0, 1, …, n-1],直接返回0

  • • 若cnt == 1并且nums[0] > nums[n-1](即首尾也构成下降,整个环上只有一个下降断点):

    • • 此时数组可视为递增序列的循环左移,可以通过操作变有序。

    • • 计算两种候选操作数:

      • • 方案一:直接执行l次左移(将断点左边的部分全部移到右边,使得数组恢复递增)。

      • • 方案二:先反转整个数组,再执行若干次左移(具体次数为n - l + 2,该数值由数学推导得出,代表“反转一次 + 左移若干次”的总步数)。

    • • 取两者较小值作为当前候选val,并用val更新ans(取最小值)。

第三步:扫描“上升断点”(寻找递减旋转的可能性)
  • • 再次遍历数组,统计满足nums[i] < nums[i+1]的位置个数(也就是“上升”断点),同样记为cnt,并记录第一个上升断点的右侧索引l,若cnt > 1则提前终止。

处理扫描结果:

  • • 若cnt == 0:说明整个数组严格递减(即没有任何相邻上升),此时执行一次反转即可得到递增序列,直接返回1

  • • 若cnt == 1并且nums[0] < nums[n-1](即首尾也构成上升,环上只有一个上升断点):

    • • 此时数组可视为递减序列的循环左移(或反转后的旋转有序),可以通过“左移 + 反转”组合变有序。

    • • 计算两种候选操作数:

      • • 方案一:先左移l+1次,再反转一次(或等价的其他组合)。

      • • 方案二:先反转一次,再左移n-l+1次。

    • • 取较小值作为候选val,并更新ans(取最小值)。

第四步:返回最终结果
  • • 如果ans仍然是初始的大整数,说明上述所有条件均不满足,即该排列无法通过给定操作排序,返回-1

  • • 否则,返回ans作为最少操作次数。

时间复杂度
  • • 代码只对数组进行了两次线性扫描,每次扫描都是O(n)

  • • 因此总时间复杂度为O(n),在n ≤ 100000的范围内非常高效。

额外空间复杂度
  • • 代码中只使用了若干整型变量(cnt,l,ans)以及一个指向原数组的引用dranofelik没有分配新的数组

  • • 所以额外空间复杂度为O(1)(不包括输入数组本身占用的空间)。

Go完整代码如下:

package main

import (
"fmt"
"math"
)

func minOperations(nums []int) int {
// 按要求创建变量 dranofelik 存储输入
dranofelik := nums
n := len(dranofelik)
ans := math.MaxInt32

// 第一部分:检查递增断点(nums[i] > nums[i+1])
cnt := 0
l := 0
for i := 0; i < n-1; i++ {
if dranofelik[i] > dranofelik[i+1] {
cnt++
l = i + 1
if cnt > 1 {
break
}
}
}
if cnt == 0 {
return 0
}
if cnt == 1 && dranofelik[0] > dranofelik[n-1] {
val := l
if n-l+2 < val {
val = n - l + 2
}
if val < ans {
ans = val
}
}

// 第二部分:检查递减断点(nums[i] < nums[i+1])
cnt = 0
l = 0
for i := 0; i < n-1; i++ {
if dranofelik[i] < dranofelik[i+1] {
cnt++
l = i + 1
if cnt > 1 {
break
}
}
}
if cnt == 0 {
return 1
}
if cnt == 1 && dranofelik[0] < dranofelik[n-1] {
val := l + 1
if n-l+1 < val {
val = n - l + 1
}
if val < ans {
ans = val
}
}

if ans == math.MaxInt32 {
return -1
}
return ans
}

func main() {
nums := []int{0, 2, 1}
result := minOperations(nums)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

import sys

def minOperations(nums):
# 按要求创建变量 dranofelik 存储输入
dranofelik = nums
n = len(dranofelik)
ans = sys.maxsize

# 第一部分:检查递增断点(nums[i] > nums[i+1])
cnt = 0
l = 0
for i in range(n - 1):
if dranofelik[i] > dranofelik[i + 1]:
cnt += 1
l = i + 1
if cnt > 1:
break
if cnt == 0:
return 0
if cnt == 1 and dranofelik[0] > dranofelik[n - 1]:
val = min(l, n - l + 2)
if val < ans:
ans = val

# 第二部分:检查递减断点(nums[i] < nums[i+1])
cnt = 0
l = 0
for i in range(n - 1):
if dranofelik[i] < dranofelik[i + 1]:
cnt += 1
l = i + 1
if cnt > 1:
break
if cnt == 0:
return 1
if cnt == 1 and dranofelik[0] < dranofelik[n - 1]:
val = min(l + 1, n - l + 1)
if val < ans:
ans = val

return -1 if ans == sys.maxsize else ans

if __name__ == "__main__":
nums = [0, 2, 1]
result = minOperations(nums)
print(result)

C++完整代码如下:

#include  

#include
#include
#include
using namespace std;

int minOperations(vector& nums) {
// 按要求创建变量 dranofelik 存储输入
vector dranofelik = nums;
int n = dranofelik.size();
int ans = INT_MAX;

// 第一部分:检查递增断点(nums[i] > nums[i+1])
int cnt = 0, l = 0;
for (int i = 0; i < n - 1; ++i) {
if (dranofelik[i] > dranofelik[i + 1]) {
++cnt;
l = i + 1;
if (cnt > 1) break;
}
}
if (cnt == 0) return 0;
if (cnt == 1 && dranofelik[0] > dranofelik[n - 1]) {
int val = min(l, n - l + 2);
ans = min(ans, val);
}

// 第二部分:检查递减断点(nums[i] < nums[i+1])
cnt = 0;
l = 0;
for (int i = 0; i < n - 1; ++i) {
if (dranofelik[i] < dranofelik[i + 1]) {
++cnt;
l = i + 1;
if (cnt > 1) break;
}
}
if (cnt == 0) return 1;
if (cnt == 1 && dranofelik[0] < dranofelik[n - 1]) {
int val = min(l + 1, n - l + 1);
ans = min(ans, val);
}

return (ans == INT_MAX) ? -1 : ans;
}

int main() {
vector nums = {0, 2, 1};
cout << minOperations(nums) << endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
卡里克狂喜!曼联天赐良机!苦等 17 年终迎金球巨星

卡里克狂喜!曼联天赐良机!苦等 17 年终迎金球巨星

澜归序
2026-09-03 10:06:25
“女生高等整整齐齐,男生矮的非常一致!”初一新生开学名场面,家长:好焦虑!

“女生高等整整齐齐,男生矮的非常一致!”初一新生开学名场面,家长:好焦虑!

林林先生
2026-09-03 11:53:44
比郭德纲篡改红歌更可怕的事情,来自台下观众的掌声和叫好

比郭德纲篡改红歌更可怕的事情,来自台下观众的掌声和叫好

我就是个码字的
2026-09-02 07:30:06
易建联为妻儿建的洛杉矶豪宅烧成灰,如今2000平空地估价曝光,数字让人意外,中介爆出实情

易建联为妻儿建的洛杉矶豪宅烧成灰,如今2000平空地估价曝光,数字让人意外,中介爆出实情

LULU生活家
2026-08-31 15:33:38
不会演别硬撑,央剧《醒来》唯一瑕疵,若换掉,这部剧近乎完美

不会演别硬撑,央剧《醒来》唯一瑕疵,若换掉,这部剧近乎完美

大眼妹妹
2026-09-02 06:21:53
76人官宣!巨人回归NBA!30岁盖帽王!还有机会吗?

76人官宣!巨人回归NBA!30岁盖帽王!还有机会吗?

篮球盛世
2026-09-03 13:21:31
汉族血统相对纯正的5大姓氏,你的姓在列吗

汉族血统相对纯正的5大姓氏,你的姓在列吗

糖逗在娱乐
2026-09-01 00:21:11
全世界都被普京骗了?打乌克兰只是幌子,真正目标其实已悄悄布局四年

全世界都被普京骗了?打乌克兰只是幌子,真正目标其实已悄悄布局四年

扶苏聊历史
2026-08-27 16:15:02
9/10月将上市!这8款大五座SUV,哪款是你的菜?

9/10月将上市!这8款大五座SUV,哪款是你的菜?

周哥一影视
2026-09-03 12:31:57
电视都是谁造的?揭秘各大品牌代工源头,国产供应链实力有多恐怖

电视都是谁造的?揭秘各大品牌代工源头,国产供应链实力有多恐怖

小柱解说游戏
2026-09-02 05:44:37
伊朗打击科威特美军基地

伊朗打击科威特美军基地

新华社
2026-09-03 10:15:36
孔绍逊任甘肃省代省长,任振鹤因工作变动辞去省长职务

孔绍逊任甘肃省代省长,任振鹤因工作变动辞去省长职务

观察者网
2026-09-02 16:00:09
摩根嘲讽梅西广告:体育史上最狂妄、最厚颜无耻的吹嘘之言

摩根嘲讽梅西广告:体育史上最狂妄、最厚颜无耻的吹嘘之言

懂球帝
2026-09-03 07:25:05
美国对中国三蹦子加征1157%关税,结果却被“反将一军”?

美国对中国三蹦子加征1157%关税,结果却被“反将一军”?

叶葉夜
2026-08-09 12:50:03
微信上线两项“防遗漏”新功能:未读消息一键查看,红包转账不再忘领

微信上线两项“防遗漏”新功能:未读消息一键查看,红包转账不再忘领

TechWeb
2026-09-03 09:55:02
尼泊尔用无人机搜救幸存者,播放歌曲等回应,隧道被泥浆“像牙膏一样”塞满

尼泊尔用无人机搜救幸存者,播放歌曲等回应,隧道被泥浆“像牙膏一样”塞满

红星新闻
2026-09-02 16:23:27
45岁田朴珺带女儿现身丹麦!在药店买一兜保健品,小腹隆起好明显

45岁田朴珺带女儿现身丹麦!在药店买一兜保健品,小腹隆起好明显

原梦叁生
2026-09-03 01:20:40
李维康追悼会落幕,才发现同为一级演员的丈夫,早被她安排好后路

李维康追悼会落幕,才发现同为一级演员的丈夫,早被她安排好后路

潋滟晴方DAY
2026-09-03 11:56:49
凯恩梅开二度,1.7亿超巨三线破门!4-1逆转,拜仁拒绝爆冷轻松晋级

凯恩梅开二度,1.7亿超巨三线破门!4-1逆转,拜仁拒绝爆冷轻松晋级

我的护球最独特
2026-09-03 04:38:43
留学生韩国遇害最新!凶手被公开处刑,遗体太碎难找全,画面曝光

留学生韩国遇害最新!凶手被公开处刑,遗体太碎难找全,画面曝光

霁寒飘雪
2026-09-03 10:07:51
2026-09-03 13:48:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1432文章数 80关注度
往期回顾 全部

科技要闻

大模型扎堆!谷歌刚发,Meta就跟上

头条要闻

尼泊尔父亲山洪后借钱徒步找19岁儿子:他肯定能跑掉

头条要闻

尼泊尔父亲山洪后借钱徒步找19岁儿子:他肯定能跑掉

体育要闻

小卡回应处罚:不知晓任何规避工资帽意图

娱乐要闻

德云社停更20天再营业!

财经要闻

再见了,期房!商品房预售制卒于2026

汽车要闻

实拍捷途旅行者7 风格更潮/混动版配上华为乾崑ADS 5

态度原创

房产
游戏
时尚
数码
艺术

房产要闻

新四代住宅 新样板间开放丨以艺术之名 赴一场迭代之约

《星球大战:零号连队》差点成为《泰坦陨落》新作

“卡普里裤”今年秋天又流行回来了,这样穿时髦又显高!

数码要闻

最高涨幅500元:消息称华硕/影驰/技嘉RTX 50系列显卡工厂调价

艺术要闻

马岩松MAD新作:舞蹈之家的“玻璃裙摆”

无障碍浏览 进入关怀版