对于序对,最好的办法就是排序。
统计数量用归并
统计最值用单调
type node struct{
Val int
Loc int
}
type nodes []node
func (s nodes)Len() int {
return len(s)
}
func (s nodes)Less(i,j int) bool {
if s[i].Val == s[j].Val{
return s[i].Loc < s[j].Loc
}
return s[i].Val < s[j].Val
}
func (s nodes)Swap(i,j int) {
s[i],s[j] = s[j],s[i]
}
func maxWidthRamp(A []int) int {
var nums nodes
for i:=0;i<len(A);i++{
nums = append(nums,node{A[i],i})
}
sort.Sort(nums)
mn := nums[0].Loc
ans := 0
for i:=1;i<len(nums);i++{
if nums[i].Loc > mn {
if nums[i].Loc - mn > ans {
ans = nums[i].Loc - mn
}
}else{
mn = nums[i].Loc
}
}
return ans
}