• 力扣(LeetCode)775. 全局倒置与局部倒置(C++)


    模拟

    理解题,全局倒置就是不相邻的逆序对,局部倒置就是相邻的逆序对。提示中给出, 0 < = n u m s [ i ] < n 0 <= nums[i] < n 0<=nums[i]<n ,其中 n = = n u m s . l e n g t h n == nums.length n==nums.length , n u m s nums nums 中的所有整数 互不相同,可知 n u m s nums nums 中包含 0 0 0 n − 1 n-1 n1 所有数。
    分情况理解:

    1. 所有数按顺序 从 0 0 0 n − 1 n-1 n1 排列,顺序数组,符合条件, r e t u r n   t r u e return~true return true
    2. 相邻的数颠倒顺序,如 0   1   2 0~1~2 0 1 2 变成 1   0   2 1~0~2 1 0 2 ,发现逆序对 < 1 , 0 > <1,0> <1,0>前一个数 1 1 1 减下标相差 1 1 1 , 后一个数 0 0 0 减下标相差 − 1 -1 1 。数和下标相差 1 1 1 − 1 -1 1 ,是局部倒置的条件,符合 t r u e true true 的要求。
    3. 同理,一个数和自己下标相差大于 1 1 1 ,这就是不相邻的逆序对(全局倒置), r e t u r n   f a l s e return~false return false

    本题之所以这么简单,是因为题目限制诸多。如果没有 n u m s nums nums 是范围 [ 0 , n − 1 ] [0, n - 1] [0,n1] 内所有数字组成的一个排列,这个限制,那么博主一时之间只能想到暴力循环了~

    代码展示
    class Solution {
    public:
        bool isIdealPermutation(vector<int>& nums) {
            for(int i = 0;i<nums.size();i++)
                if(nums[i]!= i &&i-1!=nums[i]&&i+1!=nums[i]) return false;
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    合并同类项
    class Solution {
    public:
        bool isIdealPermutation(vector<int>& nums) {
            for(int i = 0;i<nums.size();i++)
                if(abs(nums[i]-i)>1) return false;
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    博主致语

    理解思路很重要!
    欢迎读者在评论区留言,作为日更博主,看到就会回复的。

    AC

    AC

    复杂度分析
    1. 时间复杂度: O ( n ) O(n) O(n) n n n n u m s nums nums 的长度。 ,一次遍历 n u m s nums nums 的时间复杂度是 O ( n ) O(n) O(n)
    2. 空间复杂度: O ( 1 ) O(1) O(1),除若干变量使用的常量级空间,没有使用额外线性空间。
  • 相关阅读:
    ES6语法新特性(上)
    [管理与领导-120]:IT基层管理 - 决策者和管理者的灵活变通与执著坚持的平衡
    星邺汇捷实习工作日报(持续更新ing)
    AVL树(平衡搜索树)
    【观察者模式】
    六、【常用工具组】
    大数据必学Java基础(六十):集合补充
    C#Winform 打开文件浏览器
    软件测试面试题:请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系?
    lua 中文字符的判断简介
  • 原文地址:https://blog.csdn.net/Innocence02/article/details/127878484