題目連結:
題目意譯:
你被給定一個整數陣列 nums 以及兩個正整數 m 和 k。
回傳 nums 中所有長度 k 的「幾乎相異」子陣列中最大的總和值。如果不存在著這樣子的子陣列,則回傳 0。
nums 的一個子陣列是「幾乎相異」的,代表著其包含至少 m 種相異元素。
一個子陣列為一個陣列中的一個連續非空元素序列。
限制:
1 ≦ nums.length ≦ 2 × 10 ^ 4
1 ≦ m ≦ k ≦ nums.length
1 ≦ nums[i] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: nums = [2,6,7,3,1,7], m = 3, k = 4
輸出: 18
解釋: 有 3 個大小為 k = 4 的幾乎相異子陣列。這些子陣列為 [2, 6, 7, 3] 、 [6, 7, 3, 1] 和 [7, 3, 1, 7]。在這些子陣列中,有最大總和的是 [2, 6, 7, 3],而其總和值為 18。
範例 2:
輸入: nums = [5,9,9,2,4,5,4], m = 1, k = 3
輸出: 23
解釋: 有 5 個大小為 k 的幾乎相異子陣列。這些子陣列為 [5, 9, 9] 、 [9, 9, 2] 、 [9, 2, 4] 、 [2, 4, 5] 和 [4, 5, 4]。在這些子陣列中,有最大總和的是 [5, 9, 9],而其總和值為 23。
範例 3:
輸入: nums = [1,2,1,2,1,2,1], m = 3, k = 3
輸出: 0
解釋: 給定的陣列 [1,2,1,2,1,2,1] 中不存在著任何大小為 k = 3 的子陣列,其包含著至少 m = 3 種相異元素。因此幾乎相異的子陣列不存在,最大總和值為 0。
解題思維:
典型的滑動視窗(Sliding Window)之題型,如
這題。
因為我們可以看到從索引值 i 開頭的長度 k 之子陣列與索引值 i + 1 開頭的長度 k 之子陣列,兩者的元素內容幾乎一模一樣,只差在 nums[i] 以及 nums[i + k]。
因此我們只需要一個紀錄當前各種元素出現次數的資料結構(例如說雜湊表(Hash Table)),以及一個紀錄現在有多少種元素的變數。然後從索引值 0 開頭的長度 k 之子陣列開頭往右依序推得其他長度 k 的子陣列之元素種類。
然後對於這些子陣列中有符合題目定義的,取出最大的總和值即為所求(各個子陣列的總和值也可以仿照上面的方式從一個子陣列「繼承」到下一個)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。