首页 > 其他分享 >半有序排列

半有序排列

时间:2023-07-12 20:34:51浏览次数:29  
标签:排列 下标 nums int 交换 有序

给你一个下标从 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;
    }
}

标签:排列,下标,nums,int,交换,有序
From: https://www.cnblogs.com/xiaochaofang/p/17548755.html

相关文章

  • css 自定义动态排列
    需求就是显示一批头像,正常排列,很简单吧!用弹性盒子再加上允许换行,就解决了吗?问题是:头像之间有间隔,就需要加margin-right,问题来了本行最后一个盒子的空隙大了,正好能放下一个头像,这时肯定去掉margin.(这里设定最后一个盒子空隙大,当然也可能正好或者多一点点)。头像容器宽度不确定,......
  • 判断是否是完全平方数[容易]和排列箱子[容易]
    1.1.1. 完全平方数(PerfectSquare)判断正整数y是否是完全平方数。如果能找到正整数x,使得x*x==y,则y是平方数。1. 思路条件处理x*x>y丢弃右半部分x*x==yy是完全平方数x*x<y丢弃左半部分x的取值范围是[1,y],我们用左闭右开空间,就是[1,y+1)。......
  • abc073d <Floyed + 枚举排列>
    D-joisino'stravel//https://atcoder.jp/contests/abc073/tasks/abc073_d//Floyed+枚举排列#include<iostream>#include<algorithm>#include<vector>#include<cstring>usingnamespacestd;usingLL=longlong;constintN=......
  • 167. 两数之和 II - 输入有序数组
    给你一个下标从1开始的整数数组 numbers,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1<=index1<index2<=numbers.length。以长度为2的整数数组[index1,i......
  • 代码随想录算法训练营第二十四天| 491.递增子序列 46.全排列 47.全排列 II
     491.递增子序列 此题的难点:1,前提需要保留原有顺序2,保证递增3,保证去重注意:去重一定要有set的同时保证有顺序代码:1voidfindSubsequences_trackBack(vector<int>&nums,intstartIndex,vector<int>&path,vector<vector<int>>&result)2{3if(path.size(......
  • 数字全排列
     题解: 一条路走到头,然后再回头vis数组来标记已走过的点,a数组来存数字1#include<bits/stdc++.h>2usingnamespacestd;3intn;4boolvis[20];5inta[20];67voiddfs(intx)8{9if(x>n)10{11for(inti=1;i<......
  • LeetCode 108. 将有序数组转换为二叉搜索树
    题目链接:LeetCode108.将有序数组转换为二叉搜索树题意:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。解题思路:(递归)O(n)递归建立整......
  • 2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的
    2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2这样下去可以最终只剩一个数字比如:31244367916现在如果知道N,和最后的数字sum,反推最原始的序列是什么如果有多个答案,返回字典序......
  • volatile是如何保证有序性的?
    为什么需要保证有序性?有如下代码,在inti=a;执行了的情况下,i的值最终会为几?publicclassNoVolatileExample{inta=0;booleanflag=false;publicvoidwriter(){a=1;flag=true;}publicvoidreader(){if(flag......
  • Arrangement排列•Combination组合•Counting计数•Binomial Theorem二项式定理
    符号C-Combination组合数[1]A-Arrangement(旧教材为P-Permutation)N-Number元素的总个数(自然数集合).M-参与选择的元素个数(M不大于N,两者都是自然数集合).!-Factorial阶乘.Arrangement排列与Combination组合:注意:n,m都是自然数,且m<=n,下同.排列的定义:从n......