日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单调栈结构

發布時間:2025/4/5 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单调栈结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:給定一個不含重復值的數組,找到每一個i位置左邊和右邊離i位置最近且值比arr[i]小的位置。返回所有位置相應信息

舉例:

arr = {3,4,1,5,6,2,7}

返回數組:{{-1,2},{0,2},{-1,-1},{2,5},{3,5},{2,-1},{5,-1}}

進階問題:給定一個可能含有重復值的數組arr,找到每一個i位置左邊和右邊離i位置最近且值比arr[i]小的位置。返回所有位置相應信息

要求:如果arr長度為N,實現原問題和進階問題的解法,時間復雜度都達到O(N)

思路:準備一個棧,標記為stack, 棧中放的元素是數組的位置,開始時stack為空。

如果找到每一個i位置左邊和右邊離i位置最近且值比arr[i]小的位置,那么需要讓stack從棧頂到棧底的位置所代表的值是嚴格遞減的;

如果找到每一個位置左邊和右邊離i位置最近且值比arr[i]大的位置,那么需要讓stack從棧頂到棧底的位置所代表的值是嚴格遞增的

def getNearNorepeat(L):res = [[0,0]]*len(L)stack = []for i in range(len(L)):while len(stack)!=0 and L[stack[-1]] > L[i]:popIndex = stack.pop()if len(stack) == 0:lessLeftIndex = -1else:lessLeftIndex = ires[popIndex][0] = lessLeftIndexres[popIndex][1] = istack.push(i)while len(stack)!=0:popIndex = stack.pop()if len(stack) == 0:lessLeftIndex = -1else:lessLeftIndex = stack[-1]res[popIndex][0] = lessLeftIndexres[popIndex][1] = -1return res def getNearLess(L):res = [[0,0]] * len(L)stack = []for i in range(len(L)):while len(stack)!=0 and L[stack[-1][0]] > L[i]:popIndex = stack.pop()if len(stack)==0:leftLessIndex = -1else:leftLessIndex = stack[-1][len(stack[-1])-1]for index in popIndex:res[index][0] = leftLessIndexres[index][1] = iif len(stack)!=0 and L[stack[-1][0]] == L[i]:stack[-1].append(i)else:list_ = []list_.append(i)stack.push(list_)while len(stack)!=0:popIndex = stack.pop()if len(stack) == 0:leftLessIndex = -1else:leftLessIndex = stack[-1][len(stack[-1])-1]for index in popIndex:res[index][0] = leftLessIndexres[index][1] = -1return res

整個過程中,進棧一次,出棧一次,所以整個流程時間復雜度為O(N)

總結

以上是生活随笔為你收集整理的单调栈结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。