题目描述:
给你一个下标从 0 开始、长度为 n
的整数排列 nums
。
如果排列的第一个数字等于 1
且最后一个数字等于 n
,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums
变成一个 半有序排列 :
- 选择
nums
中相邻的两个元素,然后交换它们。
返回使 nums
变成 半有序排列 所需的最小操作次数。
排列 是一个长度为 n
的整数序列,其中包含从 1
到 n
的每个数字恰好一次。
代码思路:
- 获取列表长度:
- 首先,通过
n = len(nums)
获取列表nums
的长度。
- 首先,通过
- 计算数字
n
(最大值)的位置:- 使用
nums.index(n)
找到数字n
(即列表中的最大值)的索引。 - 计算
count1 = n - 1 - nums.index(n)
,这个值表示数字n
需要向右移动多少个位置才能到达列表的末尾(因为所有较大的数都应该位于末尾)。这里减1
是因为索引是从0
开始的,而我们要计算的是位置差。
- 使用
- 移除数字
n
:- 使用
nums.remove(n)
从列表中移除数字n
,因为我们接下来要计算数字1
的位置,而n
已经不在考虑范围内了。
- 使用
- 计算数字
1
的位置:- 使用
nums.index(1)
找到数字1
的索引(在移除n
之后)。 - 这个索引值直接作为
count2
,表示数字1
需要向左移动多少个位置才能到达列表的开头(因为所有较小的数都应该位于开头)。
- 使用
- 返回结果:
- 返回
count1 + count2
,即数字n
移动到末尾和数字1
移动到开头所需的最小交换次数之和。
- 返回
注意事项
- 这个方法假设输入列表
nums
包含了从1
到n
的所有整数,且每个整数只出现一次。 - 方法通过直接计算数字
n
和1
需要移动的位置来确定最小交换次数,而不是通过实际的交换操作来模拟。 - 移除数字
n
是为了简化计算数字1
位置的过程,因为一旦n
到达了正确的位置(即列表末尾),它就不会再影响数字1
的位置计算。
代码实现:
class Solution:
def semiOrderedPermutation(self, nums) :
n = len(nums)
count1 = n - 1 -(nums.index(n))
nums.remove(n)
count2 = nums.index(1)
return count1 + count2