• LeetCode-775-全局倒置与局部倒置


    在这里插入图片描述

    1、数学方法

    根据题意,显然全局倒置的值大于等于局部倒置的值。因此我们不必求出具体的全局倒置的值和局部倒置的值,我们只需要证明全局倒置的值大于局部倒置的值即可。

    因此我们可以从后往前进行查询,只要我们能够证明区间 [ i + 1 , n − 1 ] [i+1,n-1] [i+1,n1]中的最小值不仅小于 n u m s [ i ] nums[i] nums[i],而且还小于 n u m s [ i − 1 ] nums[i-1] nums[i1]即可说明当前的全局倒置的值一定大于局部倒置的值。

    class Solution {
    public:
        bool isIdealPermutation(vector<int>& nums) {
            int n = nums.size(), temp_min = nums[n - 1];
            for (int i = n - 3; i >= 0; i--) {
                if (nums[i] > temp_min) {
                    return false;
                }
                temp_min = min(temp_min, nums[i + 1]);
            }
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、数学归纳$$

    若全局倒置大于局部倒置说明存在一个 j > i + 1 j>i+1 j>i+1 n u m s [ i ] > n u m s [ j ] nums[i]>nums[j] nums[i]>nums[j],因此我们可以开始进行归纳:对于0而言,若全局倒置等于局部倒置则说明0前面最多不超过一个数字。1、若 n u m s [ 0 ] = 0 nums[0]=0 nums[0]=0,则我们需要进一步比较区间 [ 1 , n ] [1,n] [1,n]是否满足条件;2、若 n u m s [ 1 ] = 0 nums[1]=0 nums[1]=0,则我们需要进一步比较区间 [ 2 , n ] [2,n] [2,n]是否满足条件。以此类推,我们可以最终得到每个元素 n u m s [ i ] nums[i] nums[i]都应满足 ∣ n u m s [ 0 ] − 0 ∣ ≤ 1 \left | nums[0]-0\right | \le 1 nums[0]01

    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
    • 9
    • 10
    • 11
  • 相关阅读:
    Spring 四种方式教你异步接口返回结果
    DDD防腐层设计
    RL 从敲门到入门
    Linux系统后门监测工具chkrootkit安装与使用
    Ubuntu1804里进行KITTI数据集可视化操作
    Jetson TX2 刷机
    中移粤港澳大湾区创新研究院、南湖研究院类脑实验室面试(部分)
    数据结构与算法之美读书笔记14
    【第三方登录】微信web扫一扫登录步骤
    python爬取网站数据笔记分享
  • 原文地址:https://blog.csdn.net/weixin_43825194/article/details/127888874