0
点赞
收藏
分享

微信扫一扫

请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数

暮晨夜雪 2022-03-30 阅读 22
算法golang

问题描述:

请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。

例如,给定一个列表tenperatures【73,74,75,71,69,72,76,73】,你的输出应该是[1,1,4,2,1,1,0,0].

解题思路:

首先考虑要计算高于当前数值出现的位置,需要借助一个数据结构存储历史计算的结果,考虑数据特性,可以借助栈来存储,使用栈后入先出的特性,倒序存储数据的值。

根据气温列表arr的长度,初始化一个等长度存储0的数组res,遍历气温列表值v,与栈中最小的数据比较,如果小于就将数据的索引入栈,如果大于就对栈进行pop操作,获取栈中最小值,计算差距天数,添加到res对应的位置,循环直到v小于arr[index], 将数据的索引入栈,直至循环结束

package main

import (
	"fmt"
	"errors"
)

type stack []int

func(s *stack) push(v int) {
	*s = append(*s, v)
}

func(s *stack) pop() (int, error) {
	v := *s
	if len(v) == 0 {
		return 0, errors.New("Out of index, len is 0")
	}
	val := v[len(v) - 1]
	*s = v[:len(v)-1]
	return val, nil
}

func(s stack) len() int {
	return len(s)
}

func(s stack) peek() int {
	if len(s) == 0 {
		return 0
	}
	return s[len(s)-1]
}

func(s stack) isEmpty() bool {
	if len(s) == 0 {
		return true
	}
	return false
}

func waitDay(arr []int) []int {
	if len(arr) == 1 {
		return []int{0}
	}
	res := make([]int, len(arr))
	var s stack
	for i, v := range arr { 
		for !s.isEmpty() && v > arr[s.peek()] {
			index, _ :=  s.pop()
			res[index] = i - index
		}
		s.push(i)
	}

	return res
}

func main() {
	fmt.Println(waitDay([]int{73,74,75,71,69,72,76,73}))
}
举报

相关推荐

python实现一个简单的好友列表

ReactJS实现一个简单的评论列表

0 条评论