• LeetCode——半有序排列


    一、题目

    2717. 半有序排列 - 力扣(Leetcode)

    给你一个下标从 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
    解释:这个排列已经是一个半有序排列,无需执行任何操作。
    

    提示:

    • 2 <= nums.length == n <= 50
    • 1 <= nums[i] <= 50
    • nums 是一个 排列

     二、题目解读

    排列 是一个长度为 n 的整数序列,其中包含从 1 到 n 的每个数字恰好一次。

    题目要求我们将1放在数组第一个,将n放在数组最后一个。

    因为每个数字恰好一次,我们可以直接去找到1和n的位置,然后就算即可。

    三、代码 

    1. class Solution {
    2. public static int semiOrderedPermutation(int[] nums) {
    3. int l=0,r=0;
    4. for (int i=0;i//找到1和n的位置
    5. if (nums[i]==1) {
    6. l=i;
    7. }
    8. if (nums[i]==nums.length)
    9. r=i;
    10. }
    11. if (r//r在l的左边,在l移动时,r多移动了一步
    12. return l+(nums.length-r)-2;
    13. else
    14. return l+(nums.length-r)-1;
    15. }
    16. }

     

     

  • 相关阅读:
    rst 格式文档编译方案
    jenkins、sonarqube相关配置
    c++ 智能指针 (std::weak_ptr)(三)
    Camera2的使用【详细】
    浅谈继承之默认成员函数
    Linux4._冯•诺依曼体系结构
    Spark_SQL函数定义(定义UDF函数、使用窗口函数)
    一个匹配html标签的正则表达式
    mp4转gif在线转换,视频转换成gif动图怎么做?
    MySQL 慢查询经典案例分析
  • 原文地址:https://blog.csdn.net/m0_63951142/article/details/131151020