https://leetcode.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/

1. Use brute force:

  1. //TLE
  2. class Solution {
  3. public:
  4. int longestSubarray(vector<int>& nums, int limit) {
  5. if(nums.size()<=1) return nums.size();
  6. int maxlen = 1;
  7. int len = 1;
  8. int submax = 0, submin = 0;
  9. for(int i = 0; i < nums.size(); i++){
  10. submax = nums[i];
  11. submin = nums[i];
  12. len = 1;
  13. for(int j = i + 1; j < nums.size(); j++){
  14. submax = max(submax, nums[j]);
  15. submin = min(submin, nums[j]);
  16. if(abs(submax-nums[j])<=limit && abs(submin-nums[j])<=limit){
  17. len++;
  18. maxlen = max(maxlen, len);
  19. }
  20. else
  21. break;
  22. }
  23. }
  24. return max(maxlen, 1);
  25. }
  26. };

2. Use sliding window:

https://www.bilibili.com/video/BV1Cf4y1m7aN

Capture.JPG

  1. //204 ms 51.3 MB
  2. class Solution {
  3. public:
  4. int longestSubarray(vector<int>& nums, int limit) {
  5. deque<int> max_q;
  6. deque<int> min_q;
  7. int result = 0;
  8. int l = 0;
  9. for(int r = 0; r < nums.size(); r++){
  10. while(!min_q.empty() && nums[r] < min_q.back())
  11. min_q.pop_back();
  12. while(!max_q.empty() && nums[r] > max_q.back())
  13. max_q.pop_back();
  14. min_q.push_back(nums[r]);
  15. max_q.push_back(nums[r]);
  16. while(max_q.front() - min_q.front() > limit){
  17. if(max_q.front() == nums[l]) //remove itself
  18. max_q.pop_front();
  19. if(min_q.front() == nums[l]) //remove itself
  20. min_q.pop_front();
  21. l++;
  22. }
  23. result = max(result, r - l + 1);
  24. }
  25. return result;
  26. }
  27. };