程序员面试金典——17.6最小调整有序
Solution1:我的答案。垃圾算法
class Rearrange {
public:
vector<int> findSegment(vector<int> A, int n) {
// write code here
vector<int> temp = A, res(2, 0);
sort(temp.begin(), temp.end());
for(int i = 0; i < temp.size(); i++)
if(temp[i] != A[i]) {
res[0] = i;
break;
}
for(int j = temp.size() - 1; j >= 0; j--)
if(temp[j] != A[j]) {
res[1] = j;
break;
}
return res;
}
};
Solution2:
参考网址:https://www.nowcoder.com/profile/5415481/codeBookDetail?submissionId=19665157
这个思路好清奇啊~~~学习一个
复杂度为
O(n)
O
(
n
)
class Rearrange {
public:
vector<int> findSegment(vector<int> A, int n) {
// write code here
vector<int> result;
int size = A.size();
if(size == 0 || n <= 0) {
return result;
}//if
int M = 0,N = 0;
int max = A[0];
// 计算[M,N]中的N
// 如果当前元素小于之前的最大元素则说明当前元素应处于[M N]无序序列中
// 而且当前元素是当前最大下标的无序元素所以更新N为当前元素下标
for(int i = 1; i < n; ++i) {
if (A[i] >= max){
max = A[i];
}//if
else{
N = i;
}//else
}//for
int min = A[n-1];
// 计算[M,N]中的M
// 如果当前元素大于之前的最小元素则说明当前元素应处于[M N]无序序列中
// 而且当前元素是当前最小下标的无序元素所以更新M为当前元素下标
for(int i = n - 2;i >= 0;--i) {
if(A[i] <= min){
min = A[i];
}//if
else{
M = i;
}//else
}//for
result.push_back(M);
result.push_back(N);
return result;
}
};
本文介绍了两种实现最小调整有序算法的方法。Solution1采用排序对比的方式,时间复杂度较高。Solution2利用一次遍历找到无序区间的起始与结束位置,达到O(n)的时间复杂度。后者更为高效且思路独特。

被折叠的 条评论
为什么被折叠?



