陣列中元素與下一個比它大的元素之間的距離
阿新 • • 發佈:2018-12-06
棧
/*用輔助陣列儲存差值;用棧儲存陣列元素,如果遇到後面的元素大於前一個元素,就彈出棧中的元素*/
也就是說,利用棧;先判斷相鄰的兩個陣列的大小;如果後一個元素大於前一個元素preIndex,就讓輔助陣列中Preindex的值為1;如果當前元素不大於前一個元素;就移動陣列;判斷當前元素與他的後一個元素大小;滿足條件,就判斷next和pre的大小,依次進行
peek()表示棧頂元素
pop()表示彈出棧頂元素
class Solution { public int[] dailyTemperatures(int[] temperatures) { int n=temperatures.length; int[] dist=new int[n]; Stack<Integer> indexs=new Stack<>(); for(int curIndex=0;curIndex<n;curIndex++){ //當棧不為空並且陣列當前元素大於以棧定元素為索引的元素,就彈出棧頂元素;否則,將當前元素索引進棧 while(!indexs.isEmpty()&&temperatures[curIndex]>temperatures[indexs.peek()]){ int preIndex=indexs.pop(); dist[preIndex]=curIndex-preIndex; } indexs.push(curIndex); } return dist; } }
迴圈陣列中比當前元素大的下一個元素
與 739. Daily Temperatures (Medium) 不同的是,陣列是迴圈陣列,並且最後要求的不是距離而是下一個元素。
迴圈陣列迴圈兩遍,主要是找到陣列中比最後一個元素大的第一個元素。首先進行元素填充-1;找到比她大的就進行互換
class Solution { public int[] nextGreaterElements(int[] nums) { /*迴圈陣列的表示法比較難,儲存一次棧中的元素;迴圈比較兩次陣列中的元素*/ int n=nums.length; Stack<Integer> pre=new Stack<>(); int[] next=new int[n]; Arrays.fill(next,-1); for(int i=0;i<n*2;i++){ int num=nums[i%n]; while(!pre.isEmpty()&&num>nums[pre.peek()]){ next[pre.pop()]=num; } if(i<n){ pre.push(i); } } return next; } }