首页 > 其他分享 >LeetCode:2717、半有序队列

LeetCode:2717、半有序队列

时间:2024-12-11 10:53:26浏览次数:9  
标签:排列 下标 2717 nums 队列 int num 有序 LeetCode

题目:

给你一个下标从 0 开始、长度为 n 的整数排列 nums

如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列

选择 nums 中相邻的两个元素,然后交换它们。
返回使 nums 变成 半有序排列 所需的最小操作次数。

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

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

代码:

初读完题,其实就是个简单的数学问题,只要求最小的数在数组下标0处,最大的数在数组结尾,那么只要先找到数组最小和最大的数的下标位置,它的移动方式是只能交换,那么移动次数自然是下标位置到目标位置的差,这里只需要分类讨论一个最大位置索引在最小位置前面的情况,这时交换移动会重复一次只需-1即可。

点击查看代码
class Solution {
public:
    int semiOrderedPermutation(vector<int>& nums) {
        //最小值和最大值索引
        int minsize = 51;
        int maxsize = 0;
        //最小值和最大值
        int max = 0;
        int min = 51;
        //交换次数
        int num = 0;
        for (int i = 0; i < nums.size(); i ++)
        {
            if (nums[i] > max)
            {
                max = nums[i];
                maxsize = i;
            }
            if (nums[i] < min)
            {
                min = nums[i];
                minsize = i;
            }
        }
        num += minsize;
        num += nums.size() - 1 - maxsize;
        //最大值索引在最小值前面
        if (minsize > maxsize)
            num -= 1;
        return num;
    }
};

标签:排列,下标,2717,nums,队列,int,num,有序,LeetCode
From: https://www.cnblogs.com/souyou/p/18598933

相关文章

  • leetcode61:旋转链表
    原题地址:61.旋转链表-力扣(LeetCode)题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]解题思路明确旋转规则:每次旋转,将......
  • 代码随想录算法训练营第四十三天|LeetCode300.最长递增子序列、LeetCode674.最长连续
    前言打卡代码随想录算法训练营第49期第四十三天 (๑ˉ∀ˉ๑)首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode300......
  • 代码随想录:用栈实现队列
    代码随想录:用栈实现队列主要是记一下栈和队列的定义和基本使用方法,值得注意的是pop和push都是操作,没有返回值,需要先用top和front获得顶端的值。这个地方有个记忆技巧,栈只看“顶部顶端”,队列看“前后端”,即top和front-**创建栈**```cppstd::stack<int>s;检查是否为......
  • 代码随想录:用队列实现栈
    代码随想录:用队列实现栈classMyStack{public://pop就是拿队列的最后一个元素,只需要用另一个队列对现有队列遍历,拿到最后一个元素即可queue<int>target;MyStack(){}voidpush(intx){target.push(x);}intp......
  • 代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 1
    226.翻转二叉树前序和后序写法都可以我用的是前序错误写法classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;swap(root.left,root.right);invertTree(root.left);invertTree(root.r......
  • leetcode 2024. 考试的最大困扰度
    2024.考试的最大困扰度法一:两次滑动窗口classSolution{public:intmaxConsecutiveAnswers(stringanswerKey,intk){intsize=answerKey.size(),temp=k,res=0,left,right;for(left=0,right=0;right<size;++right){//F->T......
  • Leetcode_打家劫舍
    题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ......
  • leetcode 2779. 数组的最大美丽值
    2779.数组的最大美丽值暴力超时解......
  • leetcode 2958. 最多 K 个重复元素的最长子数组
    2958.最多K个重复元素的最长子数组classSolution{public:intmaxSubarrayLength(vector<int>&nums,intk){intsize=nums.size(),resLenth=0;unordered_map<int,int>numAdded;for(intleft=0,right=0;right<siz......
  • [LeetCode] 1524. Number of Sub-arrays With Odd Sum
    Givenanarrayofintegersarr,returnthenumberofsubarrayswithanoddsum.Sincetheanswercanbeverylarge,returnitmodulo109+7.Example1:Input:arr=[1,3,5]Output:4Explanation:Allsubarraysare[[1],[1,3],[1,3,5],[3],[3,5],[5]]Allsu......