半有序排列
给你一个下标从 0 开始、长度为 n 的整数排列 nums 。
如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列 :
选择 nums 中相邻的两个元素,然后交换它们。
返回使 nums 变成 半有序排列 所需的最小操作次数。
排列 是一个长度为 n 的整数序列,其中包含从 1 到 n 的每个数字恰好一次。
示例 1:
输入:nums = [2,1,4,3]
输出:2
解释:可以依次执行下述操作得到半有序排列:
1 - 交换下标 0 和下标 1 对应元素。排列变为 [1,2,4,3] 。
2 - 交换下标 2 和下标 3 对应元素。排列变为 [1,2,3,4] 。
可以证明,要让 nums 成为半有序排列,不存在执行操作少于 2 次的方案。
示例 2:
输入:nums = [2,4,1,3]
输出:3
解释:
可以依次执行下述操作得到半有序排列:
1 - 交换下标 1 和下标 2 对应元素。排列变为 [2,1,4,3] 。
2 - 交换下标 0 和下标 1 对应元素。排列变为 [1,2,4,3] 。
3 - 交换下标 2 和下标 3 对应元素。排列变为 [1,2,3,4] 。
可以证明,要让 nums 成为半有序排列,不存在执行操作少于 3 次的方案。
示例 3:
输入:nums = [1,3,4,2,5]
输出:0
解释:这个排列已经是一个半有序排列,无需执行任何操作。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/semi-ordered-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
脑筋急转弯代码,自己根本想不出来
class Solution {
public int semiOrderedPermutation(int[] nums) {
int x =0,y=0,len = nums.length;
//x代表1的位置,y代表nums.length的位置
//找到x和y的位置
for(int i=0;i<len;i++){
if(nums[i]==1)x=i;
else if(nums[i]==len) y = i;
}
//当x<y的时候,计算出x到0的距离和y到nums.length-1的距离
if(x<y)return x+(len - 1 - y);
//当y>x的时候,我们交换的时候会把xy接近了一次,所以我们只需要在原来基础上-1就行了
if(x>y)return x+(len - 2 - y);
return 0;
}
}