739 每日温度
代码如下
func dailyTemperatures(temperatures []int) []int { 单调栈中存放的是遍历过元素的下标,并且单调栈是递增的。
res := make([]int,len(temperatures)) //建立一个结果数组
stack := []int{} //设置一个单调栈
for i,v := range temperatures { 遍历数组
for len(stack) != 0 && v > temperatures[stack[len(stack)-1]] { 如果这个栈不为空,且遍历到的这个元素大于栈顶元素 那么就要进行统计 temperatures[stack[len(stack)-1]] 因为stack里存放的是下标,stack[len(stack)-1]而这个就表示栈顶元素,而栈顶元素表示数组元素的下标
top := stack[len(stack)-1] 这里取出栈顶元素的下标
stack = stack[ :len(stack)-1] 并且将这个下标出栈
res[top] = i - top 结果数组的下标就是当前遍历到的元素下标减去栈顶元素的下标
}
stack = append(stack,i) 如果不大于栈顶元素,就把这个元素的下标放入栈中
}
return res
}
496 下一个更大元素
代码如下
func nextGreaterElement(nums1 []int, nums2 []int) []int {
res := make([]int,len(nums1)) 和上题一样,设置一个结果数组
for i,_ := range res { 初始化结果数组,将结果数组的初始值设置为-1
res[i] = -1
}
mp := map[int]int{} 设立一个map,是将数组1中的值和对应的下标一一对应
for i,v := range nums1 {
mp[v] = i
}
stack := []int{} 设置一个栈
stack = append(stack,0) 因为这个栈放入的是下标,所以将nums2的第一个元素的下标放入栈中
for i := 1 ; i < len(nums2) ; i++ { 遍历nums2数组
for len(stack) != 0 && nums2[i] > nums2[stack[len(stack)-1]] { 如果栈不为空且当前遍历的元素大于栈顶的元素
top := stack[len(stack)-1] 取出这个栈顶元素的下标
if _,ok := mp[nums2[top]] ; ok { 因为这个是在nums2中出现的数字,需要去nums1中找是否存在,如果存在,取出对应的下标
index := mp[nums2[top]]
res[index] = nums2[i] 并将这个下标放入当前遍历过的元素
}
stack = stack[:len(stack)-1] 出栈
}
stack = append(stack,i)
}
return res
}