題目:
給定陣列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...