给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
生活随笔
收集整理的這篇文章主要介紹了
给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/yysdsyl/article/details/5419149#cpp
題目:
???? 給定數(shù)組Arr[n],對于其中的每個(gè)元素Arr[i](0=<i<n),在Arr[0...i-1]中找到元素Arr[k],Arr[k]滿足Arr[k]>Arr[i],并且i-k值最小(即最靠近)。
???? 要求O(n)時(shí)間內(nèi)找出Arr中所有元素對應(yīng)的Arr[k]的位置。
?????ex,
?????src[]: 9, 5, 2, 4, 7
???? dst[]: -1,0, 1, 1, 0
?
思路:
?????借助于棧來實(shí)現(xiàn),從后向前遍歷數(shù)組,while棧頂元素小于當(dāng)前遍歷的數(shù)組元素,則更新dst,并pop。
參見下面代碼
?
?
代碼:
[cpp]?view plaincopy
上面的思路比較復(fù)雜,我是這樣實(shí)現(xiàn)的:
void minDist(int *a, int *b, int n) {b[0] = -1;for (int i = 1; i <n ;++i) {int j = i - 1;while(j >=0 && a[j] <= a[i])j = b[j];b[i] = j;} }總結(jié)
以上是生活随笔為你收集整理的给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。