题目链接:点击查看

题目大意:现在给出n*(n-1)/2个关系表示n个数中两两之间的关系大小,用函数表示就是compare(a,b),若a<b,则返回值为true,否则返回值为false,要求我们编写一个类用来还原数组,并要求最多访问10*N次compare函数

题目分析:时间复杂度既然要求了10*N,那么首先就要想到nlogn,这个题目中的n给到了1e3,logn不超过10,所以满足时间复杂度的要求,现在我们就要想该怎么实现

要是用sort直接排序的话会被卡掉,因为sort是不稳定排序,也就是重复元素也有可能会互换位置,最坏的时间复杂度能到n*n的级别,肯定不满足这个题目,但我们可以用归并排序,归并排序最大的一个特点就是稳定,时间复杂度稳定在nlogn,完美契合这个题目,而且也是属于C++内置的函数stable_sort(),用法和sort一样,我也是今天才知道的。。

当然正解应该是二分来做的。。因为logn的时间复杂度也可以联想到二分,对于每一个数字二分查找所在的位置,然后直接用vector的insert函数插入就好了,也是学了一波insert函数,这个函数有两个参数,分别是pos和val,功能是将val插入到pos位置前面

这个题真的学到了不少小细节。。

代码:

归并排序:

// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.class Solution {
public:vector<int> specialSort(int N) {vector<int>ans;for(int i=1;i<=N;i++)ans.push_back(i);stable_sort(ans.begin(),ans.end(),compare);return ans;}
};

二分:

// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.class Solution {
public:vector<int> specialSort(int N) {vector<int>ans;ans.push_back(1);for(int i=2;i<=N;i++){int l=0,r=ans.size()-1;int pos=r+1;//注意pos初始化为r+1,因为最坏情况是当前的i是最大值,应该放在最后面while(l<=r){int mid=(l+r)>>1;if(compare(i,ans[mid])){pos=mid;r=mid-1;}elsel=mid+1;}ans.insert(ans.begin()+pos,i);}return ans;}
};

AcWing - 113 特殊排序(归并排序/二分)相关推荐

  1. java collections_扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 算法是数据结构的灵魂! 好的算法搭配上合适的数据结构,可以让代码功能大大的提升效率. ...

  2. Hyperset(排序+二分)

    Bees Alice and Alesya gave beekeeper Polina famous card game "Set" as a Christmas present. ...

  3. 挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel

    首先提供帮助类 可能这个类还需要更新 .求最大值.求最小值.选择排序.二分查找找出下标.二分查找排好序列里面是否有那个值 public class Util {//求最大值public static ...

  4. Bailian4143 和为给定数【排序+二分】

    和为给定数 总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行: 第一行是整数n(0 < n <= 100, ...

  5. 第十章-排序-归并排序与基数排序

    2-1 对N个记录进行归并排序,归并趟数的数量级是: (1分) O(logN) O(N) O(NlogN) O(N​2​​) 2-2 对N个记录进行归并排序,空间复杂度为: (1分) O(logN) ...

  6. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  7. AcWing 算法基础课第一节基础算法1排序、二分

    1.该系列为ACWing中算法基础课,已购买正版,课程作者为yxc 2.y总培训真的是业界良心,大家有时间可以报一下 3.为啥写在这儿,问就是oneNote的内存不够了QAQ ACwing C++ 算 ...

  8. C++ 算法基础课 01 —— 基础算法_快速排序/归并排序/二分查找/高精度

    文章目录 1 排序 1.1 快速排序(难在划分) 1.1.1 模板 1.1.2 习题1 -- 785.快速排序 1.1.3 习题2 -- 786.第k个数(快速选择算法) 1.2 归并排序(难在合并) ...

  9. 一步步地分析排序——归并排序

    前言 本文是对<算法>第四版归并排序所做的笔记,归并排序之所以值得我们仔细学习,有几个原因: 归并排序是非常经典的基于分治法的递归排序算法. 和初级排序算法(冒泡.选择.插入)在最坏的情况 ...

最新文章

  1. Unity UGUI获取鼠标在屏幕的准确点击位置
  2. mysql脚本下载_Mysql备份脚本
  3. 系统模块——什么是系统模块、path 路径操作、相对路径VS绝对路径
  4. 共享内存生产者消费者模型
  5. generator (2)
  6. [面向对象] ABAP中类重构助手Refactoring Assitant
  7. Vue使用v-bind绑定动态数据
  8. webService 使用CXF 实现简单的helloworld
  9. myeclipse 注册码生成代码(6.5----9.0均可使用)
  10. oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法
  11. vs2013 没有ef mysql_vs2013 EF Mysql
  12. 开发基于GUI的R包(2)
  13. robotframework 接口测试 +RSA 加密
  14. java手机qq表白代码_史上最感动表白QQ留言代码
  15. 无线摄像头一直显示请求服务器,远程摄像头为什么要连接服务器
  16. 激光雷达运动畸变校正
  17. vivo6.0系统设备最完美激活xposed框架的教程
  18. 使用Spring Boot构建微服务(文末福利)
  19. 从原理到CMOS图像传感器玩家,一文读懂手机摄像头所有猫腻
  20. 【Nodejs】留言板案例

热门文章

  1. Nginx的location指令
  2. springAop的底层技术
  3. Docker常用操作
  4. 利用有序节点来实现分布式锁
  5. FlashMapManager
  6. Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器
  7. List集合_介绍常用方法
  8. DataURL:概述
  9. css box 等高布局,css实现等高布局有哪些方式
  10. 创建二级索引_技术分享 | InnoDB 排序索引的构建