1. 程式人生 > >陣列中元素與下一個比它大的元素之間的距離

陣列中元素與下一個比它大的元素之間的距離

/*用輔助陣列儲存差值;用棧儲存陣列元素,如果遇到後面的元素大於前一個元素,就彈出棧中的元素*/

也就是說,利用棧;先判斷相鄰的兩個陣列的大小;如果後一個元素大於前一個元素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;
    }
}