[CareerCup] 17.6 Sort Array 排列数组

17.6 Given an array of integers, write a method to find indices m and n such that if you sorted elements m through n, the entire array would be sorted. Minimize n - m (that is, find the smallest such sequence). 

为了更好的理解题意,我们通过一个例子来分析,比如我们有如下的数组:

1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19

那么我们可以按照递增顺序将其分为三个部分:

left:         1, 2, 4, 7, 10, 11

middle:    7, 12

right:       6, 7, 16, 18, 19

只要从左右两端开始往中间搜索即可,遇到不是递增的数字就停止,然后我们要给中间的部分排序,排完序我们看left的最右边的数字是否比middle的最左边的数字小,right的最左边的数字是否比middle的最右边的数字大,如果不是,我们要shift_left和shift_right,向左边,我们再来验证整个数列是否是有序的,如果不是有序的,则说明不存在这样的index,参见代码如下:

int find_end_of_left_subsequence(vector<int> array) {
    for (int i = 1; i < array.size(); ++i) {
        if (array[i] < array[i - 1]) {
            return i - 1;
        }
    }
    return array.size() - 1;
}
int find_start_of_right_subsequence(vector<int> array) {
    for (int i = array.size() - 2; i >= 0; --i) {
        if (array[i] > array[i + 1]) {
            return i + 1;
        }
    }
    return 0;
}
int shrink_left(vector<int> array, int min_idx, int start) {
    int cmp = array[min_idx];
    for (int i = start - 1; i >= 0; --i) {
        if (array[i] <= cmp) {
            return i + 1;
        }
    }
    return 0;
}
int shrink_right(vector<int> array, int max_idx, int start) {
    int cmp = array[max_idx];
    for (int i = start; i < array.size(); ++i) {
        if (array[i] >= cmp) {
            return i - 1;
        }
    }
    return array.size() - 1;
}
bool validate(vector<int> array, int left_idx, int right_idx) {
    vector<int> middle(right_idx - left_idx + 1);
    for (int i = left_idx; i <= right_idx; ++i) {
        middle[i - left_idx] = array[i];
    }
    sort(middle.begin(), middle.end());
    for (int i = left_idx; i <= right_idx; ++i) {
        array[i] = middle[i - left_idx];
    }
    for (int i = 1; i < array.size(); ++i) {
        if (array[i - 1] > array[i]) {
            return false;
        }
    }
    return true;
}
void find_unsorted_sequence(vector<int> array) {
    int end_left = find_end_of_left_subsequence(array);
    if (end_left >= array.size() - 1) return;
    int start_right = find_start_of_right_subsequence(array);
    int max_idx = end_left;
    int min_idx = start_right;
    for (int i = end_left + 1; i < start_right; ++i) {
        if (array[i] < array[min_idx]) {
            min_idx = i;
        }
        if (array[i] > array[max_idx]) {
            max_idx = i;
        }
    }
    int left_idx = shrink_left(array, min_idx, end_left);
    int right_idx = shrink_right(array, max_idx, start_right);
    if (validate(array, left_idx, right_idx)) {
        cout << "True: " << left_idx << " " << right_idx << endl;
    } else {
        cout << "False: " << left_idx << " " << right_idx << endl;
    }
}

本文转自博客园Grandyang的博客,原文链接:排列数组[CareerCup] 17.6 Sort Array ,如需转载请自行联系原博主。

### 回答1: 17.6.0是一款名为“无止播”的直播平台的旧版,而17.6.0又是一款名为“有直播”的直播平台推出的新版。这两款直播平台都是面向广大用户开发的,为用户提供在线直播的服务。 不同的是,“无止播”拥有丰富的直播内容,包括体育赛事、音乐演唱会、游戏直播等;而“有直播”则在直播内容方面更加注重主播的精神层面,包括关于情感、心理、人生等方面的直播内容。 此外,“有直播”在用户交互方面更加注重用户体验,提供了更丰富的互动工具,让观众能够更加自由地与主播进行互动。 但无论是“无止播”还是“有直播”,在直播内容和用户体验方面都有各自的优势,用户可以根据自己的需求选择相应的直播平台进行观看。 ### 回答2: 17.6.0无直播和17.6.0有直播是针对移动直播应用“悟直播”版本升级而言的。其中,17.6.0版本为不含直播功能的旧版本,而17.6.0版本则新增了直播功能。用户在使用“悟直播”应用时,可以根据自己的需求选择相应的版本进行下载和使用。 对于不需要进行直播的用户来说,选择17.6.0无直播版本即可,该版本主要为用户提供短视频制作和分享功能,用户可以利用该版本拍摄和编辑自己的视频,并分享到社交媒体平台上,让更多的人了解和欣赏自己的作品。 而需要进行直播功能的用户,则需要选择17.6.0有直播版本,该版本除了拥有短视频制作和分享功能外,还新增了直播功能。用户可以通过该版本进行实时、互动的直播,与观众进行互动和交流,分享自己的生活、技能或者是宣传、推广产品等。 总之,“悟直播”应用的版本升级,既满足了不同用户的需求,也扩大了应用的使用范围,进一步提升了用户体验。 ### 回答3: 17.6.0无直播和17.6.0有直播是指某个应用程序或软件在不同版本中是否具有直播功能。有直播意味着该应用程序可以真实时间地播放视频或音频内容,观众可以在实时收看过程中与主播或其他观众进行互动。相反,无直播版本则不具备这一功能,仅能提供已录制的媒体内容供用户观看。 不同版本的应用程序或软件功能也会有所不同。因此,用户在选择使用应用程序前,需要了解自己的需求与该软件的功能是否相符。如果用户要求直播功能,则需要确认所选应用程序是否有该功能,以便最大程度地满足自己的需求。 总之,17.6.0无直播和17.6.0有直播是两个不同版本的应用程序,具体应根据具体需求和软件功能来选择使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值