作者JIWP (神楽めあ的錢包)
標題Re: [閒聊] 每日leetcode
時間2024-10-10 19:39:28
962. Maximum Width Ramp
ramp是指滿足下列條件的組合
(1)i<j
(2)nums[i]<nums[j]
而width定義為j-i
請找出nums中最大的width
沒有就回傳0
思路:
思路1:
建立一個長度跟nums一樣的arr
arr[i][0]=i
arr[i][1]=nums[i]
再把arr依照arr[i][1]的大小去排列
如果arr[i][1]=arr[j][1],就照i、j的大小排列
最後就從頭開始遍歷arr
先更新最小的arr[i][0](minidx)再更新最大的arr[i][0]-minidx
就可以得到答案了
思路2:
建立一個arr,放nums的index
如果nums[i]比nums[arr[len(arr)-1]]還小的話,就把i放到arr裡面
這樣可以得到一個遞減矩陣
接著從nums最後一個元素i=len(nums)-1開始
如果nums[i]比arr最後一個元素指向的數字(nums[arr[len(arr)-1]])還小
就把arr最後一個元素(ans_last)pop出來
並且更新answer=max(answer,i-arr_last)
這樣就可以得到答案了
code是思路2的
golang code :
func maxWidthRamp(nums []int) int {
stack := make([]int, 0)
for i := 0; i < len(nums); i++ {
if len(stack) == 0 || nums[i] < nums[stack[len(stack)-1]] {
stack = append(stack, i)
}
}
ans := 0
for i := len(nums) - 1; i > -1; i-- {
for len(stack) > 0 && nums[i] >= nums[stack[len(stack)-1]] {
ans = max(ans, i-stack[len(stack)-1])
stack = stack[:len(stack)-1]
}
if ans == i {
return ans
}
}
return ans
}
func max(i,j int)int{
if i>j{
return i
}
return j
}
--
※ 發信站: 批踢踢實業坊(web-ptt.org.tw), 來自: 111.71.212.203 (臺灣)
※ 文章網址: https://web-ptt.org.tw/Marginalman/M.1728560371.A.98E
→ Firstshadow: 大師 以後能內推本肥肥ㄇ 10/10 19:39