給定一個陣列 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。
返回滑動視窗最大值
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7] 解釋: 滑動視窗的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
其實這道題就是求給定陣列中獲取全部K個連續元素中最大值的集合
首先我們可能會遇到三中情況
- 當原始陣列為空的,那就直接返回一個空陣列
- 如果原始陣列的長度與給定的k是一樣的,那麼就直接去原始陣列的最大值即可
- 如果原始陣列的長度大於K,那麼我們就要求每個連續子陣列的最大值了
對於第一種情況就非常簡單了
var result []int //如果切片長度為0的話,那就直接返回空切片 if len(nums) == 0 { return result }
對於第二種情況:
//如果切片長度與k一樣 if len(nums) == k { result = append(result, getMax(nums)) return result }
對於第三種情況:
var windowSlice []int index := 0 for i := k; i <= len(nums); i++ { windowSlice = nums[index:i] result = append(result, getMax(windowSlice)) index++ } return result
這裡每次都獲取連續K個元素進行比較
全部程式碼:
package main import "fmt" func maxSlidingWindow(nums []int, k int) []int { var result []int //如果切片長度為0的話,那就直接返回空切片 if len(nums) == 0 { return result } //如果切片長度與k一樣 if len(nums) == k { result = append(result, getMax(nums)) return result } var windowSlice []int index := 0 for i := k; i <= len(nums); i++ { windowSlice = nums[index:i] result = append(result, getMax(windowSlice)) index++ } return result } func getMax(windowSlice []int) int { max := windowSlice[0] for i := 0; i < len(windowSlice); i++ { if windowSlice[i] >= max { max = windowSlice[i] } } return max } func main() { nums := []int{1, 3, -1, -3, 5, 3, 6, 7} fmt.Println(maxSlidingWindow(nums, 3)) // nums := []int{} // fmt.Println(maxSlidingWindow(nums, 0)) // nums := []int{1, -1} // fmt.Println(maxSlidingWindow(nums, 1)) }
附上老師的解法,但是我看不懂!
func maxSlidingWindow(nums []int, k int) []int { result := []int{} if len(nums) == 0 { return result } window := []int{} for i, x := range nums { if i >= k && window[0] <= i-k { window = window[1:] } for len(window) != 0 && nums[window[len(window)-1]] <= x { window = []int{} } window = append(window, i) if i >= k-1 { result = append(result, nums[window[0]]) } } return result }