Given an array of integers nums
and an integer limit
, return the size of the longest non-empty subarray such that the absolute difference between any two elements of this subarray is less than or equal to limit
.
Example 1:
Input: nums = [8,2,4,7], limit = 4 Output: 2 Explanation: All subarrays are: [8] with maximum absolute diff |8-8| = 0 <= 4. [8,2] with maximum absolute diff |8-2| = 6 > 4. [8,2,4] with maximum absolute diff |8-2| = 6 > 4. [8,2,4,7] with maximum absolute diff |8-2| = 6 > 4. [2] with maximum absolute diff |2-2| = 0 <= 4. [2,4] with maximum absolute diff |2-4| = 2 <= 4. [2,4,7] with maximum absolute diff |2-7| = 5 > 4. [4] with maximum absolute diff |4-4| = 0 <= 4. [4,7] with maximum absolute diff |4-7| = 3 <= 4. [7] with maximum absolute diff |7-7| = 0 <= 4. Therefore, the size of the longest subarray is 2.
Example 2:
Input: nums = [10,1,2,4,7,2], limit = 5 Output: 4 Explanation: The subarray [2,4,7,2] is the longest since the maximum absolute diff is |2-7| = 5 <= 5.
Example 3:
Input: nums = [4,2,2,2,4,4,2,2], limit = 0 Output: 3
Constraints:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9
A:
这个题目错了在2个地方。
第一首先是没有看清题意。 忽略了any .
************method 1 , use order sorted data structure ********
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public: int longestSubarray(vector<int>& nums, int limit) { int curMax = 0; // use multiset to save the sorted values multiset<int> MS; // default is decending order int start = 0; for(int i =0;i<nums.size();i++){ MS.insert(nums[i]); while(*MS.rbegin() - *MS.begin() > limit){ MS.erase(MS.find(nums[start++])); } curMax = max(curMax, int(MS.size()) ); } return curMax; } }; |
Mistakes:
multiset 不能直接 *Mset.end() 因为其值未定义。 所以要用Mset.rbegin()
*****************method 2 , using Deque to save the MAX and MIN so far ***************
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Solution { public: int longestSubarray(vector<int>& nums, int limit) { int n = nums.size(); int start = 0; int res = 0; deque<int> increaseD, decreaseD; for(int i =0;i<n; i++){ int val = nums[i]; while(not increaseD.empty() && increaseD.back() > val){ increaseD.pop_back(); } increaseD.push_back(val); while((not decreaseD.empty() && decreaseD.back() < val )){ decreaseD.pop_back(); } decreaseD.push_back(val); while(decreaseD.front() - increaseD.front() > limit){ int delVal = nums[start++]; if(increaseD.front() == delVal ){ increaseD.pop_front(); } if(decreaseD.front() == delVal){ decreaseD.pop_front(); } } res = max(res, i - start+1); } return res; } }; |
Mistakes:
line 18, decreaseD.front() - increaseD.front() 写反了。 哎,SB了
Learned:
1: using multiset . default multiset<int> is descending order
No comments:
Post a Comment