需要排序的最短子陣列的長度

2021-07-10 10:19:50 字數 1787 閱讀 7273

演算法描述:

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中元素均為正整數。思路 分別從 左 右 記錄最大元素值 比較最大元素值和當前遍歷元素的大小 如果 最大...