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

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 归并排序求逆序度
      • 2.2 二分查找
      • 2.3 一次遍历

1. 题目

数组 A 是 [0, 1, ..., N - 1] 的一种排列,N 是数组 A 的长度。

  • 全局倒置指的是 i,j 满足 0 <= i < j < N 并且 A[i] > A[j]
  • 局部倒置指的是 i 满足 0 <= i < N 并且 A[i] > A[i+1]

当数组 A 中全局倒置的数量等于局部倒置的数量时,返回 true 。

示例 1:
输入: A = [1,0,2]
输出: true
解释:1 个全局倒置,和 1 个局部倒置。示例 2:
输入: A = [1,2,0]
输出: false
解释:2 个全局倒置,和 1 个局部倒置。注意:
A 是 [0, 1, ..., A.length - 1] 的一种排列
A 的长度在 [1, 5000]之间

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/global-and-local-inversions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 归并排序求逆序度

参考:剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

class Solution {int local = 0, global = 0;vector<int> tmp;
public:bool isIdealPermutation(vector<int>& A) {if(A.size() <= 1) return true;for(int i = 0; i < A.size()-1; ++i)if(A[i] > A[i+1])local++;tmp.resize(A.size());mergesort(A, 0, A.size()-1);return local == global;//逆序度 == 局部逆序度}void mergesort(vector<int>& A, int l, int r){if(l >= r) return;int mid = (l+r)/2;mergesort(A, l, mid);mergesort(A, mid+1, r);int i = l, j = mid+1, k = 0;while(i <= mid && j <= r){if(A[i] <= A[j])tmp[k++] = A[i++];else//后序写入时,检查前面没有出队的(比我大,我在后面){tmp[k++] = A[j++];global += mid-i+1;}}while(i <= mid)tmp[k++] = A[i++];while(j <= r)tmp[k++] = A[j++];k = 0; i = l;while(i <= r)A[i++] = tmp[k++];}
};

时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)
192 ms 33.8 MB

2.2 二分查找

  • 全局倒置数量肯定 >= 局部倒置数量
  • 检查每个数字 A[i]A[i]A[i],它的前面 [0,i−2][0, i-2][0,i2] (相邻的不需要检查)存在比它大的数,肯定不满足题意
class Solution {
public:bool isIdealPermutation(vector<int>& A) {set<int> s;s.insert(A[0]);for(int i = 2; i < A.size(); ++i){if(s.lower_bound(A[i]+1) != s.end()){	//前面存在比 A[i] 大的数return false;}s.insert(A[i-1]);}return true;}
};

时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)
396 ms 52.1 MB

2.3 一次遍历

优化:在第二种方法的基础上,记录前面的最大值即可

class Solution {
public:bool isIdealPermutation(vector<int>& A) {int MAX = A[0];for(int i = 2; i < A.size(); ++i){if(MAX > A[i])return false;MAX = max(MAX, A[i-1]);}return true;}
};

时间复杂度 O(n)O(n)O(n)
148 ms 32.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jquery事件、冒泡、委托与节点

1-jquery属性操作 1、html() 取出或设置html内容 // 取出html内容 var $htm $(#div1).html(); // 设置html内容 $(#div1).html(<span>添加文字</span>); 2、prop() 取出或设置某个属性的值 注&#xff1a;attr可以读取自定义属性 // 取出图片的地址 var $src $(#i…

使用 ServiceStack 构建跨平台 Web 服务

本文主要来自MSDN杂志《Building Cross-Platform Web Services with ServiceStack》&#xff0c;Windows Communication Foundation (WCF) 是一个相当优秀的服务框架&#xff0c;当我们讨论跨平台的服务的时候&#xff0c;虽然WCF对WebService的支持还行&#xff0c;在面对一些…

Hive基础(一)

一、Hive是什么 Hive是基于Hadoop的一个数据仓库工具(离线)&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。&#xff0c;它能接收用户输入的sql语句&#xff0c;然后把它翻译成mapreduce程序对HDFS上的数据进行查询、运算&#xff0c;…

LeetCode 926. 将字符串翻转到单调递增(动态规划)

文章目录1. 题目2. 解题1. 题目 如果一个由 0 和 1 组成的字符串&#xff0c;是以一些 0&#xff08;可能没有 0&#xff09;后面跟着一些 1&#xff08;也可能没有 1&#xff09;的形式组成的&#xff0c;那么该字符串是单调递增的。 我们给出一个由字符 0 和 1 组成的字符串…

利用Jqurey写一个输入内容增加并且可以删除,上下移动的标签

最终结果如下&#xff0c;输入内容增加标签并且可以删除&#xff0c;上下移动&#xff1a; 代码赏析&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>todolist</title><style type…

java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等

java的注释、关键字、标识符、变量常量、 数据类型、运算符、流程控制等 1. java概述 1.1 java的技术体系 Java SE&#xff1a;是Java的标准版&#xff0c;提供了完整的java核心API。 Java EE&#xff1a;是Java的企业版&#xff0c;主要用于开发…

LeetCode 851. 喧闹和富有(拓扑排序)

文章目录1. 题目2. 解题1. 题目 在一组 N 个人&#xff08;编号为 0, 1, 2, ..., N-1&#xff09;中&#xff0c;每个人都有不同数目的钱&#xff0c;以及不同程度的安静&#xff08;quietness&#xff09;。 为了方便起见&#xff0c;我们将编号为 x 的人简称为 "perso…

Jquery练习题—实现分组添加功能

实现分组添加功能&#xff1a; <title>Insert title here</title> <script type"text/javascript" src"js/jquery-1.12.4.min.js"></script> <script type"text/javascript"> $(function(){ //需求1&#xff1a;…

PostgreSQL参数学习:vacuum_defer_clean_age

官方文档&#xff1a; http://www.postgresql.org/docs/9.3/static/runtime-config-replication.html 为了防止slave端读取数据时&#xff0c;因为读到的是旧有数据而被强制取消&#xff0c;设定了这么一个以transaction为单位的值。 就是可以保证经过这么多的trsanction后&…

java的常用引用类、数组、String类

java的常用引用类、数组、String类 1. 常用引用类 1.1 Scanner 一个简单的文本扫描器类。 使用&#xff1a; //创建扫描器对象 Scanner sc new Scanner(System.in); //接收用户输入字符串类型的数据 String str sc.next(); //接收用户输入整数类型的数据 …

json-ajax-jsonp-cookie

json json是 JavaScript Object Notation的首字母缩写&#xff0c;单词的意思是javascript对象表示法&#xff0c;这里说的json指的是类似于javascript对象的一种数据格式&#xff0c;目前这种数据格式比较流行&#xff0c;逐渐替换掉了传统的xml数据格式。 json是轻量级,易解…

LeetCode 981. 基于时间的键值存储(哈希+二分查找)

文章目录1. 题目2. 解题1. 题目 创建一个基于时间的键值存储类 TimeMap&#xff0c;它支持下面两个操作&#xff1a; set(string key, string value, int timestamp) 存储键 key、值 value&#xff0c;以及给定的时间戳 timestamp。 get(string key, int timestamp) 返回先…

java的类与对象

java的类与对象 1 面向对象 1.1 面向对象与面向过程的区别 面向过程和面向对象都是解决问题的逻辑方法&#xff0c;面向过程是强调解决问题的步骤&#xff0c;可以先定义多个函数&#xff0c;在使用的使用调用函数即可&#xff1b;面向对象把问题分解成多个对象&#xff0c;…

学车总结

学车总结&#xff1a; 1、左脚离合&#xff0c;右脚油门和刹车。2、左脚脚跟着地&#xff0c;用脚尖控制离合。3、踩离合要快&#xff0c;松要慢点&#xff1b;刹车刚好相反。4、平时不要猛打方向盘&#xff0c;轻微调整就行&#xff0c;需要拐急弯要降低车速。5、换挡时需要将…

建设网站需要的Bootstrap介绍与操作

01-流体布局 流体布局,就是使用百分比来设置元素的宽度,元素的高度值固定, calc()&#xff1a;可以通过计算的方式给元素添加尺寸,比如:width:calc(25%-4px); box-sizing&#xff1a;content-box默认的盒子计算方式 2.border-box 盒子的计算方式从边框开始,盒子的尺寸,边框和…

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换

文章目录1. 什么是人脸识别2. One-Shot学习3. Siamese 网络4. Triplet 损失5. 人脸验证与二分类6. 什么是神经风格迁移7. 深度卷积网络在学什么8. Cost function9. Content cost function10. Style cost function11. 一维到三维推广作业参考&#xff1a;吴恩达视频课深度学习笔…

java的封装,继承,多态

java的封装&#xff0c;继承&#xff0c;多态 1 封装 1.1 封装 指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据&#xff0c;必须通过严格的…

详解一个自己原创的正则匹配IP的表达式

第一种方法&#xff08;可以匹配有点毛病&#xff09;&#xff1a;检测IP地址的正则表达式 正则表达式&#xff1a; ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 红色块代…

亚洲赛前训练计划

回顾和加深所学算法。 主要回顾用途及使用方法。 图论方面&#xff1a; 1.dfs,bfs 2.强连通&#xff0c;点双连通&#xff0c;边双连通&#xff0c;2-sat 3.匈牙利算法km,以及不等式解 4.网络流&#xff0c;费用流 5.最短路&#xff0c;SPFA&#xff0c;dijstra, floay,斯坦纳树…

天池在线编程 2020年9月26日 日常周赛题解

文章目录1. K步编辑2. 折纸3. 字符串的不同排列4. 硬币排成线题目地址&#xff0c;请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target)&#xff0c;输出所有可以经过不多于 k 次操作得到目标字符串的字符串。 你可以对字符串进行一下的3种操作:…