請根據每日?
氣溫
?列表?temperatures
?,重新生成一個列表,要求其對應位置的輸出為:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之后都不會升高,請在該位置用?0
?來代替。輸入:temperatures= [73,74,75,71,69,72,76,73]
輸出:?[1,1,4,2,1,1,0,0]
每日溫度是一道很典型的單調棧的問題,就是求下一個最大****,下面先列出單調棧的模板
public int[] humdrum3tack(int[] nums) {int n = nums.length;// 存放答案的數組int[] res = new int[n];Stack<Integer> s = new Stack<>(); // 倒著往棧里放 如果是環狀,則使用取模運算進行繞環for (int i = n - 1; i >= 0; i--) {// 判定個子高矮while (!s.isEmpty() && s.peek() <= nums[i]) {// 把小于當前元素的棧中元素進行彈棧s.pop();}//如果棧中沒元素,則后面沒有比自己大的值,如果有,則是棧頂元素res[i] = s.isEmpty() ? -1 : s.peek();s.push(nums[i]);}return res;
下面利用圖進行說明:
?單調棧又是什么什么原理呢?
? ? ? ?入隊的時候不斷的和棧頂進行比較,小于入棧元素的直接進行出棧,如果入棧的時候棧為空,說明當前元素后面沒有比當前元素大的值了
public int[] dailyTemperatures(int[] temperatures) {//對 入參進行判斷if(temperatures==null||temperatures.length==0);int n=temperatures.length;Stack<Pair> stack=new Stack<>();//用來維護結果的結果數組int[] res=new int[n];//單調棧一般都是從后往前比遍歷for(int i=n-1;i>=0;i--){//如果當前棧不為空且棧頂元素小于當前入棧元素,直接進行出棧while(!stack.isEmpty()&&stack.peek().val<=temperatures[i]){stack.pop();}//填充結果res[i]=stack.isEmpty()?0:stack.peek().index-i;//將當前元素進行入棧stack.push(new Pair(temperatures[i],i));}return res;}class Pair{private int val;private int index;public Pair(int val,int index){this.val=val;this.index=index;}}
?