[CTCI] 最小调整有序
题目描述
有一个整数数组,请编写一个函数,找出索引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] 最小调整有序的更多相关文章
- lintcode: 最小调整代价
题目 最小调整代价 给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少. 样例 对于数组,最小的调整 ...
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
- API的理解和使用——有序集合
有序集合常用的命令 命令 功能 zadd key score member [score member ... ] 添加元素 zcard key 计算成员个数 zscore key member 计算 ...
- codeforces724-B. Batch Sort
想着想着就忘了有什么问题没解决,坑啊 一开始读错题意了,而且一着急写了两大段差不多的代码,冗余度啊,不说了.. 显然的一点,给的数据是绝对离散的,每行都是1~m的排列 难点一.如何移动能使未排序的数组 ...
- C++ STL源代码学习之算法篇
///因为篇幅太长,因此,删去了非常多接口,仅仅分析了内部实现,算法对迭代器的要求也被删去 /// search. template <class _ForwardIter1, class _F ...
- kmeans算法理解及代码实现
github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法 对于"监督学习"(supervised ...
- LINUX内核内存屏障
================= LINUX内核内存屏障 ================= By ...
- 算法导论——lec 12 平摊分析与优先队列
在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...
- 我在GNU/Linux下使用的桌面环境工具组合
为了使GNU/Linux桌面环境下加载的程序较少以节省内存资源和提高启动时间,我目前并不使用重量级的桌面环境KDE和Gnome,甚至连登录窗界面gdm或xdm都不用,而是直接启动到控制台,登录后调用s ...
随机推荐
- zstu 4247-萌新的旅行
题目大意: zstu的萌新们准备去自助旅行,他们租了一辆吉普车,然后选择了n个城市作为游览地点.然后他们惊喜的发现他们选择的城市刚好绕城一个环. 也就是说如果给所有城市按照0,1,2,……,n-1编号 ...
- BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所 ...
- 消息确认机制---confirm异步
一:介绍 1.异步模式介绍 Channel对象提供ConfirmListener()回调方法只包含deliverTag(当前Channel发出的序列号),我们需要自己为每一个Channel维护一个un ...
- GreenDao与ReactiveX的完美搭配
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6719380.html 作为Android开发者,一定不会对 GreenDao 和 ReactiveX 陌生 ...
- DataTable保存为Excel或者Txt
保存为txt的时候,可保持原来的行列对齐,如下:using System; using System.Collections.Generic; using System.Text; using Sys ...
- java中的文件下载
package com.pb.down;import java.io.File;import java.io.FileInputStream;import java.io.IOException; i ...
- Codeforces Round #532 (Div. 2)
Codeforces Round #532 (Div. 2) A - Roman and Browser #include<bits/stdc++.h> #include<iostr ...
- Django的使用规则
ORM应该算是Python的一大特色,功能类似于Mybatis或hibernate,但是显示要强大更多 一:terminal下命令行的使用 1.创建一个Project django-admin sta ...
- 使用 IntraWeb (28) - 基本控件之 TIWTemplateProcessorHTML、TIWLayoutMgrHTML、TIWLayoutMgrForm
TIWTemplateProcessorHTML //使用外部的 html 文件做模板 TIWLayoutMgrHTML //直接输入 Html 文本做模板 TIWLayoutMgrForm //这应 ...
- 中文分词组件:thulac及jieba试用手记
一.THULAC THULAC由<清华大学自然语言处理与社会人文计算实验室>研制推出的一套中文词法分析工具包.官网地址:http://thulac.thunlp.org,该项目提供了多种语 ...