一、题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
1 | 输入: [2, 6, 4, 8, 10, 9, 15] |
说明 :
- 输入的数组长度范围在 [1, 10,000]。
- 输入的数组可能包含重复元素 ,所以升序的意思是<=。
二、题解
1.算法描述
- 排序+逐位异或+双指针扫描
- 双指针
2.个人分析
- 首先利用快速排序数组进行升序排序,然后与原数组逐位异或,位置没变的元素就会变成0,然后利用头尾指针扫描,每遇到0,就将数组长度减一,头尾指针都遇到不为零的数时,停止扫描
- 总结时发现,只利用双指针就行了,头尾指针向中间扫描时,头指针扫描的数应该是越来越大的,而尾指针扫描的数应该是越来越小的,当头指针的后一个数比当前位置的数小时,头指针就应该停下了,尾指针亦然;当头尾指针相遇,则表明这是一个完全有序的数组,所以返回0.
3.代码
1 | int compare1(const void *a, const void *b) |