AcWing - 113 特殊排序(归并排序/二分)
题目链接:点击查看
题目大意:现在给出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 特殊排序(归并排序/二分)相关推荐
- java collections_扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 算法是数据结构的灵魂! 好的算法搭配上合适的数据结构,可以让代码功能大大的提升效率. ...
- Hyperset(排序+二分)
Bees Alice and Alesya gave beekeeper Polina famous card game "Set" as a Christmas present. ...
- 挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel
首先提供帮助类 可能这个类还需要更新 .求最大值.求最小值.选择排序.二分查找找出下标.二分查找排好序列里面是否有那个值 public class Util {//求最大值public static ...
- Bailian4143 和为给定数【排序+二分】
和为给定数 总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行: 第一行是整数n(0 < n <= 100, ...
- 第十章-排序-归并排序与基数排序
2-1 对N个记录进行归并排序,归并趟数的数量级是: (1分) O(logN) O(N) O(NlogN) O(N2) 2-2 对N个记录进行归并排序,空间复杂度为: (1分) O(logN) ...
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
- AcWing 算法基础课第一节基础算法1排序、二分
1.该系列为ACWing中算法基础课,已购买正版,课程作者为yxc 2.y总培训真的是业界良心,大家有时间可以报一下 3.为啥写在这儿,问就是oneNote的内存不够了QAQ ACwing C++ 算 ...
- C++ 算法基础课 01 —— 基础算法_快速排序/归并排序/二分查找/高精度
文章目录 1 排序 1.1 快速排序(难在划分) 1.1.1 模板 1.1.2 习题1 -- 785.快速排序 1.1.3 习题2 -- 786.第k个数(快速选择算法) 1.2 归并排序(难在合并) ...
- 一步步地分析排序——归并排序
前言 本文是对<算法>第四版归并排序所做的笔记,归并排序之所以值得我们仔细学习,有几个原因: 归并排序是非常经典的基于分治法的递归排序算法. 和初级排序算法(冒泡.选择.插入)在最坏的情况 ...
最新文章
- Unity UGUI获取鼠标在屏幕的准确点击位置
- mysql脚本下载_Mysql备份脚本
- 系统模块——什么是系统模块、path 路径操作、相对路径VS绝对路径
- 共享内存生产者消费者模型
- generator (2)
- [面向对象] ABAP中类重构助手Refactoring Assitant
- Vue使用v-bind绑定动态数据
- webService 使用CXF 实现简单的helloworld
- myeclipse 注册码生成代码(6.5----9.0均可使用)
- oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法
- vs2013 没有ef mysql_vs2013 EF Mysql
- 开发基于GUI的R包(2)
- robotframework 接口测试 +RSA 加密
- java手机qq表白代码_史上最感动表白QQ留言代码
- 无线摄像头一直显示请求服务器,远程摄像头为什么要连接服务器
- 激光雷达运动畸变校正
- vivo6.0系统设备最完美激活xposed框架的教程
- 使用Spring Boot构建微服务(文末福利)
- 从原理到CMOS图像传感器玩家,一文读懂手机摄像头所有猫腻
- 【Nodejs】留言板案例