题目描述:
给你一个下标从 0 开始、长度为 n
的整数排列 nums
。
如果排列的第一个数字等于 1
且最后一个数字等于 n
,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums
变成一个 半有序排列 :
- 选择
nums
中相邻的两个元素,然后交换它们。
返回使 nums
变成 半有序排列 所需的最小操作次数。
排列 是一个长度为 n
的整数序列,其中包含从 1
到 n
的每个数字恰好一次。
代码思路:
- 初始化变量:
rec
:记录交换次数。step
:用于遍历和交换元素的索引。
- 第一阶段:将1移动到数组的第一个位置:
- 找到数字1在数组中的索引
step
。 - 通过一个循环,不断将1向前移动一个位置,直到它到达数组的第一个位置。
- 每次移动都增加
rec
的值(记录交换次数)。
- 找到数字1在数组中的索引
- 第二阶段:将最大元素移动到数组的最后一个位置:
- 找到数组最大元素(这里假设数组的最大元素就是其长度
len(nums)
,这个假设在一般情况下是不成立的,除非题目有特别说明)的索引step
。 - 通过一个循环,不断将最大元素向后移动一个位置,直到它到达数组的最后一个位置。
- 每次移动都增加
rec
的值。
- 找到数组最大元素(这里假设数组的最大元素就是其长度
- 返回结果:
- 返回
rec
,即总共的交换次数。
- 返回
代码实现:
class Solution(object):def semiOrderedPermutation(self, nums):""":type nums: List[int]:rtype: int"""rec = 0step = nums.index(1)while step:nums[step],nums[step-1] = nums[step-1],nums[step]step-=1rec+=1length = len(nums)step = nums.index(len(nums))while step<length-1:nums[step],nums[step+1] = nums[step+1],nums[step]step+=1rec+=1return rec