《Cracking the Coding Interview》——第17章:普通题——题目6
2014-04-28 23:28
489 查看
2014-04-28 22:49
题目:给定一个整数数组。如果你将其中一个子数组排序,那么整个数组都变得有序。找出所有这样子数组里最短的一个。
解法:线性时间,常数空间内可以解决,思想类似于动态规划。通过正反扫描两次,可以得出这个区间的两端。只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素与当前最大(最小)元素来更新结果。请看代码。
代码:
题目:给定一个整数数组。如果你将其中一个子数组排序,那么整个数组都变得有序。找出所有这样子数组里最短的一个。
解法:线性时间,常数空间内可以解决,思想类似于动态规划。通过正反扫描两次,可以得出这个区间的两端。只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素与当前最大(最小)元素来更新结果。请看代码。
代码:
// 17.6 Given an array, if you sort a subarray of it, the total array will become sorted. Find the length of the shortest of all such subarrays. #include <cstdio> #include <vector> using namespace std; void findUnsortedSequence(vector<int> &v, int &left_index, int &right_index) { int n = v.size(); left_index = right_index = -1; if (n < 2) { return; } int val; int i; val = v[0]; for (i = 1; i <= n - 1; ++i) { val = v[i] > val ? v[i] : val; if (v[i] < val) { right_index = i; } } val = v[n - 1]; for (i = n - 2; i >= 0; --i) { val = v[i] < val ? v[i] : val; if (v[i] > val) { left_index = i; } } } int main() { vector<int> v; int i; int n; int left_index, right_index; while (scanf("%d", &n) == 1 && n > 0) { v.resize(n); for (i = 0; i < n; ++i) { scanf("%d", &v[i]); } findUnsortedSequence(v, left_index, right_index); printf("(%d, %d)\n", left_index, right_index); v.clear(); } return 0; }
相关文章推荐
- 《Cracking the Coding Interview》——第17章:普通题——题目9
- 《Cracking the Coding Interview》——第17章:普通题——题目2
- 《Cracking the Coding Interview》——第17章:普通题——题目10
- 《Cracking the Coding Interview》——第17章:普通题——题目3
- 《Cracking the Coding Interview》——第17章:普通题——题目11
- 《Cracking the Coding Interview》——第17章:普通题——题目12
- 《Cracking the Coding Interview》——第17章:普通题——题目13
- 《Cracking the Coding Interview》——第17章:普通题——题目4
- 《Cracking the Coding Interview》——第17章:普通题——题目14
- 《Cracking the Coding Interview》——第17章:普通题——题目5
- 《Cracking the Coding Interview》——第17章:普通题——题目7
- 《Cracking the Coding Interview》——第17章:普通题——题目8
- 《Cracking the Coding Interview》——第17章:普通题——题目1
- 《Cracking the Coding Interview》——第3章:栈和队列——题目5
- 《Cracking the Coding Interview》——第4章:树和图——题目1
- 《Cracking the Coding Interview》——第5章:位操作——题目7
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目8
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目3
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目10
- 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目2