區間子數組個數

題目描述

給定一個元素都是正整數的數組A ,正整數 L 以及 R (L <= R)。
求連續、非空且其中最大元素滿足大於等於L 小於等於R的子數組個數。

樣例

輸入:
A = [2, 1, 4, 3]
L = 2
R = 3
輸出: 3
解釋: 滿足條件的子數組: [2], [2, 1], [3].
注意:

  • L, R 和 A[i] 都是整數,範圍在 [0, 10^9]。
  • 數組 A 的長度範圍在[1, 50000]。

題解

  • 定義兩個變量left和right標識有效數據的左邊界和右邊界,初始爲0,有效數據指的是≤R的數。
  • 定義gap標識有效區域中最右側的在L~R之間的數,初始爲-1
  • 如果nums[i]>R,那麼left、right分別置爲i+1,gap置爲-1
  • 如果nums[i]<L,那麼判斷gap是否≥left,如果滿足則統計子數組的數量
  • 如果nums[i]在L和R之間,更新gap的右邊界,並且統計子數組的數量right-left+1,最後有效區域右邊界right++
  • 時間複雜度爲O(N)
public int numSubarrayBoundedMax(int[] A, int L, int R) {
		int count=0;
		int l=0,gap=-1;
		for(int i=0;i<A.length;i++) {
			if(A[i]>R) {
				l=i+1;
				gap=-1;
			}else if(A[i]<L) {
				if(gap>=l)
					count+=gap-l+1;
			}else {
				gap=i;
				count+=gap-l+1;
			}
		}
		return count;
	}
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章