滑動視窗求滿足的子陣列個數

2021-08-07 03:51:04 字數 735 閱讀 3746

題目:

給定陣列arr和整數num,返回有多少個子陣列滿足如下情況:

max(arr[i..j]) - min(arr[i..j]) <= num

max(arr[i..j])表示子陣列arr[i..j]中的最大值,min(arr[i..j])表示子陣列arr[i..j]中的最小值。

如果陣列長度為 n,請實現時間複雜度為 o(n)的解法。

解題思路:

有兩個定理:

1、若陣列的max-min<=k,則子陣列中max-min<=k成立

2、若陣列的max-min<=k不成立,則子陣列中

max-min<=k不成立

c++程式;]

#include

#include

#include

using namespace std;

int fun(int* a,int length,int num)

if(left==maxque.front())

maxque.pop_front();

if(left==minque.front())

minque.pop_front();

count+=right-left;

left++;

}return count;

}int main()

;int length=sizeof(a)/sizeof(a[0]);

coutreturn 0;

}

滑動視窗 求最長連續子陣列

給定乙個陣列 和乙個數字k 4。求這個陣列的乙個最長連續子陣列,這個最長連續子陣列中所有數字的和必須小於或等於k。例如,上面這個例子中,連續子陣列有這麼多種情況 其中符合條件的就只有。分析的資料跟題目不一樣但是換湯不換藥 存放基礎資料 int k 4 目標 int sum 9 int len 9 滑...

求滿足某種條件的子串問題 滑動視窗法

維護乙個invariant,視窗對應的子串始終滿足給定條件 滑動的方式是 右邊滑為主迴圈,如果沒有破壞invariant,則到下一輪繼續滑。否則要fix 對invariant的破壞,通過乙個內部迴圈不管滑動左邊並測試,直到重新滿足invariant。在這個過程中記錄invariant的最長值。適合的...

滑動視窗 長度最小的子陣列

滑動視窗 長度最小的子陣列 暴力法 區間由left,和right確定,因此需要兩層for迴圈遍歷left和right,o n 2 滑動視窗法 滑動視窗也是使用雙指標確定視窗的left和right,left和right如何移動?right要從0 到length 1移動,步長1,也就是用for迴圈,le...