文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 证明
    • 代码
    • 复杂度分析

题目

标题和出处

标题:全局倒置与局部倒置

出处:775. 全局倒置与局部倒置

难度

6 级

题目描述

要求

给你一个长度为 n\texttt{n}n 的整数数组 nums\texttt{nums}nums,表示在 [0,n-1]\texttt{[0, n - 1]}[0, n - 1] 范围内的所有整数的一个排列。

全局倒置的数量是满足以下条件的不同的下标对 (i,j)\texttt{(i, j)}(i, j) 的数量:

  • 0≤i<j<n\texttt{0} \le \texttt{i} < \texttt{j} < \texttt{n}0≤i<j<n
  • nums[i]>nums[j]\texttt{nums[i]} > \texttt{nums[j]}nums[i]>nums[j]

局部倒置的数量是满足以下条件的不同的下标 i\texttt{i}i 的数量:

  • 0≤i<n-1\texttt{0} \le \texttt{i} < \texttt{n - 1}0≤i<n - 1
  • nums[i]>nums[i+1]\texttt{nums[i]} > \texttt{nums[i + 1]}nums[i]>nums[i + 1]

当全局倒置的数量等于局部倒置的数量时,返回 true\texttt{true}true。

示例

示例 1:

输入:nums=[1,0,2]\texttt{nums = [1,0,2]}nums = [1,0,2]
输出:true\texttt{true}true
解释:有 1\texttt{1}1 个全局倒置和 1\texttt{1}1 个局部倒置。

示例 2:

输入:nums=[1,2,0]\texttt{nums = [1,2,0]}nums = [1,2,0]
输出:false\texttt{false}false
解释:有 2\texttt{2}2 个全局倒置和 1\texttt{1}1 个局部倒置。

数据范围

  • n=nums.length\texttt{n} = \texttt{nums.length}n=nums.length
  • 1≤n≤105\texttt{1} \le \texttt{n} \le \texttt{10}^\texttt{5}1≤n≤105
  • 0≤nums[i]<n\texttt{0} \le \texttt{nums[i]} < \texttt{n}0≤nums[i]<n
  • nums\texttt{nums}nums 中的所有整数都是不同的
  • nums\texttt{nums}nums 是在 [0,n-1]\texttt{[0, n - 1]}[0, n - 1] 范围内的所有整数的一个排列

解法一

思路和算法

根据全局倒置与局部倒置的定义可知,局部倒置一定是全局倒置,因此如果全局倒置的数量等于局部倒置的数量,则每个全局倒置一定是局部倒置,即对于任意 0≤i<j<n0 \le i<j< n0≤i<j<n,当 j−i≥2j-i \ge 2j−i≥2 时一定有 nums[i]<nums[j]\textit{nums}[i]<\textit{nums}[j]nums[i]<nums[j]。

朴素的解法是对于 [0,n−2)[0, n-2)[0,n−2) 区间中的每个 iii,遍历 [i+2,n)[i+2, n)[i+2,n) 区间中的每个 jjj,如果发现 nums[i]>nums[j]\textit{nums}[i]>\textit{nums}[j]nums[i]>nums[j],则此时的 (i,j)(i, j)(i,j) 是全局倒置但不是局部倒置,返回 false\text{false}false。如果遍历结束时没有发现 nums[i]>nums[j]\textit{nums}[i]>\textit{nums}[j]nums[i]>nums[j],则返回 true\text{true}true。该解法的时间复杂度是 O(n2)O(n^2)O(n2)。

注意到对于任意 2≤j<n2 \le j<n2≤j<n,只要存在一个 iii 满足 0≤i≤j−20 \le i \le j-20≤i≤j−2 且 nums[i]>nums[j]\textit{nums}[i]>\textit{nums}[j]nums[i]>nums[j],即存在一组 (i,j)(i, j)(i,j) 是全局倒置但不是局部倒置。因此,对于 0≤i<n−20 \le i<n-20≤i<n−2,令 maxValue\textit{maxValue}maxValue 表示 nums[0]\textit{nums}[0]nums[0] 到 nums[i]\textit{nums}[i]nums[i] 中的最大值,如果 maxValue>nums[i+2]\textit{maxValue}>\textit{nums}[i+2]maxValue>nums[i+2],即可返回 false\text{false}false。如果遍历结束时没有发现 maxValue>nums[i+2]\textit{maxValue}>\textit{nums}[i+2]maxValue>nums[i+2] 的情况,则返回 true\text{true}true。使用该解法,可以将时间复杂度降低到 O(n)O(n)O(n)。

代码

class Solution {public boolean isIdealPermutation(int[] nums) {int n = nums.length;int maxValue = -1;for (int i = 0; i < n - 2; i++) {maxValue = Math.max(maxValue, nums[i]);if (maxValue > nums[i + 2]) {return false;}}return true;}
}

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是数组 nums\textit{nums}nums 的长度。需要遍历数组一次。

  • 空间复杂度:O(1)O(1)O(1)。

解法二

思路和算法

该解法基于一个事实:长度为 nnn 的数组 nums\textit{nums}nums 的全局倒置的数量等于局部倒置的数量,其充分必要条件是对于任意 0≤i<n0 \le i<n0≤i<n,都有 ∣nums[i]−i∣≤1\big|\textit{nums}[i]-i\big| \le 1∣∣​nums[i]−i∣∣​≤1。

基于上述事实,可以得到一个简单的解法:遍历数组 nums\textit{nums}nums,对于任意 0≤i<n0 \le i<n0≤i<n,如果发现 ∣nums[i]−i∣>1\big|\textit{nums}[i]-i\big|>1∣∣​nums[i]−i∣∣​>1,即返回 false\text{false}false,如果对所有的 iii 都有 ∣nums[i]−i∣≤1\big|\textit{nums}[i]-i\big| \le 1∣∣​nums[i]−i∣∣​≤1,则返回 true\text{true}true。

证明

对于上述命题,需要从必要性和充分性两个方面证明。

  1. 必要性

已知长度为 nnn 的数组 nums\textit{nums}nums 的全局倒置的数量等于局部倒置的数量。假设存在 0≤i<n0 \le i<n0≤i<n,使得 ∣nums[i]−i∣>1\big|\textit{nums}[i]-i\big|>1∣∣​nums[i]−i∣∣​>1。

如果 nums[i]−i>1\textit{nums}[i]-i>1nums[i]−i>1,等价于 nums[i]−i≥2\textit{nums}[i]-i \ge 2nums[i]−i≥2,在下标 iii 的右侧共有 n−i−1n-i-1n−i−1 个元素,但是比 nums[i]\textit{nums}[i]nums[i] 大的元素不会超过 n−i−3n-i-3n−i−3 个,因此至少有 222 个大于 nums[i]\textit{nums}[i]nums[i] 的元素在下标 iii 的左侧,其中至少有 111 个元素和 nums[i]\textit{nums}[i]nums[i] 不相邻,该元素和 nums[i]\textit{nums}[i]nums[i] 即为一组全局倒置但不是局部倒置,因此全局倒置的数量大于局部倒置的数量,与已知条件矛盾。

如果 i−nums[i]>1i-\textit{nums}[i]>1i−nums[i]>1,等价于 i−nums[i]≥2i-\textit{nums}[i] \ge 2i−nums[i]≥2,在下标 iii 的左侧共有 iii 个元素,但是比 nums[i]\textit{nums}[i]nums[i] 小的元素不会超过 i−2i-2i−2 个,因此至少有 222 个小于 nums[i]\textit{nums}[i]nums[i] 的元素在下标 iii 的右侧,其中至少有 111 个元素和 nums[i]\textit{nums}[i]nums[i] 不相邻,该元素和 nums[i]\textit{nums}[i]nums[i] 即为一组全局倒置但不是局部倒置,因此全局倒置的数量大于局部倒置的数量,与已知条件矛盾。

综上所述,如果存在 0≤i<n0 \le i<n0≤i<n,使得 ∣nums[i]−i∣>1\big|\textit{nums}[i]-i\big|>1∣∣​nums[i]−i∣∣​>1,则一定会存在一组全局倒置不是局部倒置,与已知条件矛盾。因此如果长度为 nnn 的数组 nums\textit{nums}nums 的全局倒置的数量等于局部倒置的数量,则对于任意 0≤i<n0 \le i<n0≤i<n,都有 ∣nums[i]−i∣≤1\big|\textit{nums}[i]-i\big| \le 1∣∣​nums[i]−i∣∣​≤1。

  1. 充分性

对于任意 0≤i<n0 \le i<n0≤i<n,都有 ∣nums[i]−i∣≤1\big|\textit{nums}[i]-i\big| \le 1∣∣​nums[i]−i∣∣​≤1。

如果存在 0≤i<n−10 \le i<n-10≤i<n−1 满足 nums[i]=i+1\textit{nums}[i]=i+1nums[i]=i+1,则必有 nums[i+1]=i\textit{nums}[i+1]=inums[i+1]=i,否则一定会出现 ∣nums[n−1]−(n−1)∣>1\big|\textit{nums}[n-1]-(n-1)\big| > 1∣∣​nums[n−1]−(n−1)∣∣​>1。

如果存在 0≤i<n−10 \le i<n-10≤i<n−1 满足 nums[i]=i+1\textit{nums}[i]=i+1nums[i]=i+1 且 nums[i+1]≠i\textit{nums}[i+1] \ne inums[i+1]​=i,则必有 nums[i+1]=i+2\textit{nums}[i+1]=i+2nums[i+1]=i+2,根据数学归纳法可知,对任意 i≤j<n−1i \le j<n-1i≤j<n−1 都有 nums[j]=j+1\textit{nums}[j]=j+1nums[j]=j+1,此时 nums[n−1]<n−2\textit{nums}[n-1]<n-2nums[n−1]<n−2,因此 ∣nums[n−1]−(n−1)∣>1\big|\textit{nums}[n-1]-(n-1)\big| > 1∣∣​nums[n−1]−(n−1)∣∣​>1,与已知条件矛盾。因此如果 nums[i]=i+1\textit{nums}[i]=i+1nums[i]=i+1,则必有 nums[i+1]=i\textit{nums}[i+1]=inums[i+1]=i。

同理可得,如果存在 0<i≤n−10<i \le n-10<i≤n−1 满足 nums[i]=i−1\textit{nums}[i]=i-1nums[i]=i−1,则必有 nums[i−1]=i\textit{nums}[i-1]=inums[i−1]=i,否则一定会出现 ∣nums[0]−0∣>1\big|\textit{nums}[0]-0\big| > 1∣∣​nums[0]−0∣∣​>1。

由于对任意 0≤i<n0 \le i<n0≤i<n 都有 ∣nums[i]−i∣≤1\big|\textit{nums}[i]-i\big| \le 1∣∣​nums[i]−i∣∣​≤1,因此全局倒置的数量等于局部倒置的数量。

代码

class Solution {public boolean isIdealPermutation(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {if (Math.abs(nums[i] - i) > 1) {return false;}}return true;}
}

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是数组 nums\textit{nums}nums 的长度。需要遍历数组一次。

  • 空间复杂度:O(1)O(1)O(1)。

数组题目:全局倒置与局部倒置相关推荐

  1. leetcode 775. Global and Local Inversions | 775. 全局倒置与局部倒置(Java)

    题目 https://leetcode.com/problems/global-and-local-inversions/ 题解 看了评论区答案. 局部倒置一定是全局倒置:局部倒置是连续递减: 所以只 ...

  2. LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)

    文章目录 1. 题目 2. 解题 2.1 归并排序求逆序度 2.2 二分查找 2.3 一次遍历 1. 题目 数组 A 是 [0, 1, ..., N - 1] 的一种排列,N 是数组 A 的长度. 全 ...

  3. 静态数组,全局数组,局部数组的初始化区别

    定义数组后,未初始化 #define LEN1 5 static int array_static_glogal[LEN1];//定义静态全局数组,未初始化数组成员 int array_glogal[ ...

  4. 【转载】树状数组题目

    先提个注意点,由于Lowbit(0) = 0,这会导致x递增的那条路径发生死循环,所有当树状数组中可能出现0时,我们都全部加一,这样可以避免0带来的麻烦-- 简单:       POJ 2299 Ul ...

  5. npm包全局安装和局部安装,执行包命令有什么不同?

    之前开发了一个npm的包.在实际应用中发现了一个问题.如果你想要直接执行这个包的命令,那么你就需要全局安装这个包.如果你只是局部安装,且没有在package.json文件中配置的话,就会提示该命令无法 ...

  6. Vue组件之全局组件与局部组件

    组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下, ...

  7. 16-作用域(全局作用域及局部作用域)

    16-作用域(全局作用域及局部作用域) //作用域 全局作用域 函数作用域 //函数的内部环境可以访问到所有外部环境的值,但是外部环境不能访问内部环境的值 //注意事项 //在全局变量和局部变量不同名 ...

  8. 二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)

    数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 也就是说,想法很简单,但实现起来 可能就不是那么回事了. 首先要知道数组在内存中的存储方 ...

  9. 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

    一.什么是组件化? 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题 ...

最新文章

  1. BaaS模式的开发思路
  2. react native 报错:cannot read property 'length' of undefined
  3. PHP中几种加密形式
  4. Android开发--Service和Activity通过广播传递消息
  5. Hadoop学习笔记—8.Combiner与自定义Combiner
  6. 使用jQuery获取GridView的数据行的数量
  7. import torch 找不到模块_Python零基础入门:关于Python模块与包的详细解读和使用...
  8. 用Python画二元高次方程
  9. 蓝牙耳机什么牌子好_盘点千元内最好的蓝牙耳机
  10. 恶补FPGA知识——亚稳态
  11. 计算机专业处理器和显卡,45.显卡篇-处理器显卡和独立显卡哪个好-电脑自学网...
  12. 博图region用法_西门子1200PLC的OB块用法讲解
  13. 内置CRC于文本文件中的方法
  14. 英语国际音标教学视频
  15. Protected Sky黑名单移除攻略
  16. touchgfx程序_基于TouchGFX和FreeRTOS的智能家居解决方案
  17. java new short_Java中的Java.Lang.Short类 - Break易站
  18. 专访天天画报软件主创人禹健:让内容在桌面上灵动飞扬
  19. VVIC平台API接口: item_search - 根据关键词取商品列表
  20. 程序员的内涵之基于SDK的Windows应用程序框架代码详解

热门文章

  1. 阿里云短信服务使用介绍
  2. Linux常用英文总结
  3. 【原创】随手记下-电脑版微信双开
  4. Linux 用户管理及用户权限设置
  5. HDU - 6578 Blank dp
  6. golang 将EBCDIC转成ASCII
  7. python:实现DES和3DES加解密算法(附完整源码)
  8. HTML点击图片实现跳转的两种方法
  9. Python pandas练习Retuns50stocks股票,纯英文ipynb作业20题,100%正确答案
  10. 地表反射率影响因素_全了,高考地理答题要点归纳!