ETH官方钱包

前往
大廳
主題

LeetCode - 2779. Maximum Beauty of an Array After Applying Operation 解題心得

Not In My Back Yard | 2024-10-11 12:00:01 | 巴幣 4 | 人氣 12

題目連結(jié):


題目意譯:
你被給定一個索引值從 0 開始數(shù)的陣列 nums 以及一個非負整數(shù) k。

在一次操作中,你會做以下事情:
    選擇一個位於範圍 [0, nums.length - 1] 中且還尚未被選過的索引值 i。
    將 nums[i] 替換成範圍 [nums[i] - k, nums[i] + k] 中的任一整數(shù)。

一個陣列的美麗度定義為最長的子序列之長度,其中該子序列只由相同的元素所組成。

回傳執(zhí)行任意次操作後,陣列 nums 的最大美麗度為何。

注意到你最多只能對每一個索引值執(zhí)行恰好一次操作。

一個陣列中的一個子序列是藉由從原陣列中刪除若干個(可以沒有)元素,並且不更動剩餘元素的相對位置而得到。

限制:
1 ≦ nums.length ≦ 10 ^ 5
0 ≦ nums[i], k ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums = [4,6,1,2], k = 2
輸出: 3
解釋: 在此例中,我們可以執(zhí)行以下操作:
- 選擇索引值 1,將其替換為 4(從範圍 [4,8] 選出),nums = [4,4,1,2]。
- 選擇索引值 3,將其替換為 4(從範圍 [0,4] 選出),nums = [4,4,1,4]。
在執(zhí)行操作後,陣列 nums 的美麗度為 3(由索引值 0 、 1 和 3 所組成的子序列)。
可以證明 3 是我們可以達成的最大長度。

範例 2:
輸入: nums = [1,1,1,1], k = 10
輸出: 4
解釋: 在此例中,我們不需要執(zhí)行任何操作。
陣列 nums 的美麗度為 4(即整個陣列)。


解題思維:
由於每一個數(shù)字可以變化成的數(shù)字範圍是只看自己原本的數(shù)值,因此將 nums 中的數(shù)字由小排到大並不會改變每一個數(shù)字各自可以改變成什麼數(shù)字。

接著,我們可以觀察到如果 nums[i] 可以變成跟 nums[j] 一樣的數(shù)字,代表著 nums[i] - k ≦ nums[j] ≦ nums[i] + k。

因此我們可以套用滑動視窗(Sliding Window,如這題)的技巧,也就是說對於每一個 nums[i] 維護 nums[i] + k 最遠可以涵蓋到哪個 nums[j] - k,其中 i ≦ j;當然,也可以維護 nums[i] - k 最遠可以涵蓋到哪個 nums[j] + k,其中 i ≧ j。

以前者為例(如範例程式碼)的話,則對於 nums[i] 來說的最長子序列之長度會是 j - i + 1。

而正如一般的滑動視窗之題型(如上面連結(jié)的題目),每一個 i 值的「j」是可以「繼承」的。即 nums[0] 的 j 值必定 ≦ nums[1] 的 j 值。

因此 i 和 j 只會越來越大。因此時間複雜度為排序 + 滑動視窗 = O(n log(n)) + O(n) = O(n log(n))。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作