问题描述: 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序,即输出数组得最短无序子数组。
思路: 既然要成为升序排列,那么数组第一个元素为最小值,最后一个元素为最大值;再依次判断第二个、第三个......是否依次升序,倒数第二个、倒数第三个......是否为依次降序,如果不是按依次大小排列得顺序,则返回下标值。
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main() {
int A[] = { 1,6,4,7,12,10,19 };
int size = sizeof(A) / sizeof(A[0]);
int i;
int min, max;
int left = 0;
int right = size - 1;
min = A[0];
max = A[0];
// 求最值
for (i = 0; i < size; i++) {
if (A[i] < min) {
min = A[i];
}
if (A[i] > max) {
max = A[i];
}
}
// 最值是否是头尾并移动左右值
while (left <= right) {
printf("最短无序数组下标:");
if (A[left] == min && A[right] != max) {
while (A[left] < A[left + 1]) {
left++;
}
printf("%d %d\n", left, right);
break;
}
else if (A[left] != min && A[right] == max) {
while (A[right] > A[right - 1]) {
right--;
}
printf("%d %d\n", left, right);
break;
}
else if (A[left] != min && A[right] != max) {
printf("%d %d\n", left, right);
}
else if (A[left] == min && A[right] == max) {
while (A[left] < A[left + 1]) {
left++;
}
while (A[right] > A[right - 1]) {
right--;
}
printf("%d %d\n", left, right);
break;
}
}
// 输出最小无序
printf("最短无序子数组: \n");
for (i = left; i <= right; i++) {
printf("%d ", A[i]);
}
printf(" \n");
system("pause");
return 0;
}
运行结果:
最短无序数组下标:1 5
最短无序子数组:
6 4 7 12 10
请按任意键继续. . .