最小调整有序

题目描述

有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。

给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的起点和终点。(原序列位置从0开始标号,若原序列有序,返回[0,0])。保证A中元素均为正整数。

测试样例:
[1,4,6,5,9,10],6
返回:[2,3]


先分别找到左边第一对逆序对与右边第一对逆序对,然后找出两个逆序对之间的最大值与最小值,然后分别向两边扩展边界到最小值与最大值。

 class Rearrange {
public:
int findEndOfLeft(vector<int> &A) {
for (int i = ; i < A.size(); ++i) {
if (A[i] < A[i-]) return i - ;
}
return A.size() - ;
}
int findStartOfRight(vector<int> &A) {
for (int i = A.size() - ; i >= ; --i) {
if (A[i] > A[i+]) return i + ;
}
return ;
}
int shrinkLeft(vector<int> &A, int min_idx, int start) {
int comp = A[min_idx];
for (int i = start - ; i >= ; --i) {
if (A[i] <= comp) return i + ;
}
return ;
}
int shrinkRight(vector<int> &A, int max_idx, int start) {
int comp = A[max_idx];
for (int i = start; i < A.size(); ++i) {
if (A[i] >= comp) return i - ;
}
return A.size() - ;
}
vector<int> findSegment(vector<int> A, int n) {
// write code here
int end_left = findEndOfLeft(A);
int start_right = findStartOfRight(A);
int min_idx = end_left + ;
if (min_idx >= A.size()) return {, };
int max_idx = start_right - ;
for (int i = end_left; i <= start_right; ++i) {
if (A[i] < A[min_idx]) min_idx = i;
if (A[i] > A[max_idx]) max_idx = i;
}
int left_idx = shrinkLeft(A, min_idx, end_left);
int right_idx = shrinkRight(A, max_idx, start_right);
return {left_idx, right_idx};
}
};

[CTCI] 最小调整有序的更多相关文章

  1. lintcode: 最小调整代价

    题目 最小调整代价 给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少. 样例 对于数组,最小的调整 ...

  2. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

  3. API的理解和使用——有序集合

    有序集合常用的命令 命令 功能 zadd key score member [score member ... ] 添加元素 zcard key 计算成员个数 zscore key member 计算 ...

  4. codeforces724-B. Batch Sort

    想着想着就忘了有什么问题没解决,坑啊 一开始读错题意了,而且一着急写了两大段差不多的代码,冗余度啊,不说了.. 显然的一点,给的数据是绝对离散的,每行都是1~m的排列 难点一.如何移动能使未排序的数组 ...

  5. C++ STL源代码学习之算法篇

    ///因为篇幅太长,因此,删去了非常多接口,仅仅分析了内部实现,算法对迭代器的要求也被删去 /// search. template <class _ForwardIter1, class _F ...

  6. kmeans算法理解及代码实现

    github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法   对于"监督学习"(supervised ...

  7. LINUX内核内存屏障

    =================                          LINUX内核内存屏障                          ================= By ...

  8. 算法导论——lec 12 平摊分析与优先队列

    在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...

  9. 我在GNU/Linux下使用的桌面环境工具组合

    为了使GNU/Linux桌面环境下加载的程序较少以节省内存资源和提高启动时间,我目前并不使用重量级的桌面环境KDE和Gnome,甚至连登录窗界面gdm或xdm都不用,而是直接启动到控制台,登录后调用s ...

随机推荐

  1. Python 2维数组90度旋转

    一.二维列表 a = [[col for col in range(4)] for row in range(4)] [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3] ...

  2. mac 回车键、空格键失灵(非物理原因)解决方法

    1.关机2.按住shift+control+option+开关机键,大概10秒左右,观察键盘电源灯是否变色,确定是否硬件故障,不变色表正常.3.先按下开关机键后,放开.然后同时按住option+com ...

  3. 洛谷 p1434 滑雪【记忆化搜索】

    <题目链接> Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  4. HDU1575-Tr 【矩阵快速幂】(模板题)

    <题目链接> 题目大意: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input 数据的第一行是一个T,表示有T组数据. 每组数据的第 ...

  5. P1279 字串距离

    P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...

  6. 启动Azure模拟器出错解决方案

    错误弹窗: 输出控制台: Microsoft Azure Tools: Warning: Overriding public port 80 to 2888 in role 'WebRole1'. M ...

  7. Python图形编程探索系列-08-再次认识标签

    标签的各种属性 代码展示: import tkinter as tk root = tk.Tk() root.geometry = '500x300' label1 = tk.Label(root, ...

  8. 28BYJ-48步进电机

    28BYJ-48步进电机:1.步进电机是一种将电脉冲转化为角位移的执行机构. 2.通俗一点讲:当步进驱动器接收到 一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角). 3.通过控 ...

  9. win10常用快捷命令——运行面板启动

    打开运行面板,WIN+R 打开命令提示符面板  ,在运行面板输入cmd,回车                      打开控制面板  ,在运行面板输入control,回车 打开IIS管理器面板  , ...

  10. iOS离屏渲染之优化分析

    在进行iOS的应用开发过程中,有时候会出现卡顿的问题,虽然iOS设备的性能越来越高,但是卡顿的问题还是有可能会出现,而离屏渲染是造成卡顿的原因之一.因此,本文主要分析一下离屏渲染产生的原因及避免的方法 ...