演算法描述:
1. 從左往右找」當前值比max小」的一系列情況:
初始:max=arr[0];
如果當前元素比max大,max就等於當前元素;
如果當前元素比max小,max不變,然後繼續往後找,直到最後一次出現」當前值比max小」的情形,記下此時的下標為k。
2. 從右往左找」當前值比min大」的一系列情況:
初始:min=arr[6];
如果當前元素比min小,min就等於當前元素;
如果當前元素比min大,min不變,然後繼續往前找,直到最後一次出現就」當前值比min大」的情形,記下此時的下標為j。
3. 長度=k-j+1。
過程演示:
1. 從左往右找的過程:
max= arr[0]=1
max < arr[1] ,max=arr[1]=5
max > arr[2], 此時開始出現max > 當前值的情況
max > arr[3]
max > arr[4]
max < arr[5],max=arr[5]
max < arr[6]
故arr[4]最後一次出現這種情況的位置,記錄下來,此時為k = 4
注意:如果陣列是[1,5,3,4,2,6,7,0],則
…max=arr[5],max=arr[5]
maxarr[7]=0,故最後一次出現」max>當前值」的情況是k=7
2 . 從右往左的過程
(在c語言中給陣列長度,可以直接定位到陣列最右端)
min = arr[6] = 7
min > arr[5], min=arr[5]=6
min > arr[4], min=arr[4]=2
min < arr[3]=4
min < arr[2]=3
min < arr[1]=5
min > arr[0]=1,故arr[1]是最後一次出現這種情況的位置,記錄下來,此時為j=1
綜上,從j=1到k=4這個下標出是需要排序的部分,長度為4。
**實現:
/**最短排序
* 對於乙個無序陣列a,請設計乙個演算法,求出需要排序的最短子陣列的長度。
* 給定乙個整數陣列a及它的大小n,請返回最短子陣列的長度。
* 時間複雜度o(n) 空間複雜度o(1)
* [1,5,3,4,2,6,7],7
* 返回:4
*@author fanff
* */
public
class
shortsubsequence ;
system.out.println(getminlength(arr));
}public
static
intgetminlength(int arr)
int min = arr[arr.length - 1];
int minindex = -1;
for (int i = arr.length - 2; i != -1; --i) else
}if (minindex == -1)
int max = arr[0];
int maxindex = -1;
for (int i = 1; i != arr.length; i++) else
}return maxindex - minindex + 1;
}}
演算法 需要排序的最短子陣列長度
給定乙個無序陣列,求出需要排序的最短子陣列的長度。例如 arr 返回4,因為只有 5,3,4,2 需要排序。解決這個問題可以在時間複雜度為o n 額外空間複雜度為o 1 完成。初始化變數nominindex 1,從右向左遍歷,便利的過程記錄右側出現過的數的最小值,記為min。假設當前數為arr i ...
2 1 需排序的最短子陣列長度
題目描述 對於乙個無序陣列a,請設計乙個演算法,求出需要排序的最短子陣列的長度。給定乙個整數陣列a及它的大小n,請返回最短子陣列的長度。測試樣例 1,5,3,4,2,6,7 7 返回 4 1 2 這個題在牛客網上的講解我感覺是有點問題的,3因為預設了公升序排序!4如下實現對陣列 8,7,6,5,4,...
待排序的最短子陣列長度 C 版
題目 對於乙個陣列,請設計乙個高效演算法計算需要排序的最短子陣列的長度。給定乙個int陣列a和陣列的大小n,請返回乙個二元組,代表所求序列的長度。原序列位置從0開始標號,若原序列有序,返回0 保證a中元素均為正整數。思路 分別從 左 右 記錄最大元素值 比較最大元素值和當前遍歷元素的大小 如果 最大...