日常記錄 :LeetCode 239題 滑動窗口最大值

Java

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || k <= 0 ) return  new int[0] ;
        if( k == 1 ) return nums;
        int n = nums.length ;
        int[] r = new int[n - k + 1] ;
        int index = 0 ;

        Deque<Integer> q = new ArrayDeque<>();
        for (int i = 0 ; i < nums.length ; i ++) {
            
            while( !q.isEmpty() && q.peek() < i - k + 1) {
                q.poll();
            }

            while( !q.isEmpty() && nums[q.peekLast()] < nums[i] ) {
                q.pollLast();
            }
            // add
            q.offer(i) ;
            if( i >= k - 1 ){
                r[index++] = nums[q.peek()];
            }
        }
        return r ;
    }
}

Golang

func maxSlidingWindow(nums []int, k int) []int {

	// 排除出可以直接返回的數組
	if len(nums) == 0 || k == 1 { return nums }

	// 判斷數組長度
	if( len(nums) < k ) {
		sort.Ints(nums)
		return nums[len(nums) - 1 : len(nums)]
	}

	// 設置遍量
	var area []int
	var temp []int

	// 開始切片
	for i := 0 ; i < len(nums) ; i ++ {

		for len(temp) != 0 && temp[0] < i - k + 1 {
			temp = temp[1:]
		}

		for len(temp) != 0 && nums[ temp[len(temp) - 1] ] < nums[i] {
			temp = temp[:len(temp)-1]
		}

		temp = append(temp,i)

		if i >= k - 1 {
			area = append(area,nums[temp[0]])
		}
	}
	return area
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章