• 《Cracking the Coding Interview》——第17章:普通题——题目6


    2014-04-28 22:49

    题目:给定一个整数数组。如果你将其中一个子数组排序,那么整个数组都变得有序。找出所有这样子数组里最短的一个。

    解法:线性时间,常数空间内可以解决,思想类似于动态规划。通过正反扫描两次,可以得出这个区间的两端。只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素当前最大(最小)元素来更新结果。请看代码。

    代码:

     1 // 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.
     2 #include <cstdio>
     3 #include <vector>
     4 using namespace std;
     5 
     6 void findUnsortedSequence(vector<int> &v, int &left_index, int &right_index)
     7 {
     8     int n = v.size();
     9     
    10     left_index = right_index = -1;
    11     if (n < 2) {
    12         return;
    13     }
    14     int val;
    15     int i;
    16     
    17     val = v[0];
    18     for (i = 1; i <= n - 1; ++i) {
    19         val = v[i] > val ? v[i] : val;
    20         if (v[i] < val) {
    21             right_index = i;
    22         }
    23     }
    24     
    25     val = v[n - 1];
    26     for (i = n - 2; i >= 0; --i) {
    27         val = v[i] < val ? v[i] : val;
    28         if (v[i] > val) {
    29             left_index = i;
    30         }
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     vector<int> v;
    37     int i;
    38     int n;
    39     int left_index, right_index;
    40     
    41     while (scanf("%d", &n) == 1 && n > 0) {
    42         v.resize(n);
    43         for (i = 0; i < n; ++i) {
    44             scanf("%d", &v[i]);
    45         }
    46         findUnsortedSequence(v, left_index, right_index);
    47         printf("(%d, %d)
    ", left_index, right_index);
    48         v.clear();
    49     }
    50     
    51     return 0;
    52 }
  • 相关阅读:
    iPhone开发指南应用程序核心
    id,SEL,Nil,nil,IMP,Method,Class类型
    需求驱动赢得创新
    Linux内核list&hlist解读
    转载:x86的cpu_relax解析
    hadoop开发者第三期
    Hadoop开发者入门专刊
    Hadoop源代码eclipse编译指南
    高效的使用stl::map和std::set
    配置VIM语法高亮及自动缩进
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3698244.html
Copyright © 2020-2023  润新知