leetcode日記 1248 統計優美子陣列

2021-10-05 07:14:49 字數 1976 閱讀 9830

題目描述:

給你乙個整數陣列 nums 和乙個整數 k。

如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是「優美子陣列」。

請返回這個陣列中「優美子陣列」的數目。

1 <= nums.length <= 50000

1 <= nums[i] <= 10^5

1 <= k <= nums.length

思路:參考了題解,使用雙指標。因為奇數的數量k是固定的,所以如果超出數量左指標右移,如果少於數量右指標右移,如果數量相等統計左指標左側0數量的個數,右指標右側連續0數量的個數。

可行的優化方法:可以記錄每個奇數左右相鄰的連續0的個數,甚至可以記下他們對應的下標,在取數和判斷的時候能大大加快運算速度。時間複雜度o(n),空間複雜度o(n)。

基本**如下,沒有考慮上述優化方法,空間複雜度是o(1):

#define mmax(a, b)        ((a) > (b)? (a) : (b))

#define mmin(a, b) ((a) < (b)? (a) : (b))

#define is_odd(a) ((a) % 2 == 1)

//【演算法思路】雙指標。

int numberofsubarrays(int* nums, int numssize, int k)

}int odd_cnt = 0;

int ret = 0;

//由rr增加當前奇數個數,ll移動將個數降低

while(rr < numssize)

if(odd_cnt < k)

//找到k個奇數,開始統計個數

//尋找左邊偶數的個數

int lcnt = 0;

for(int i = ll - 1; i >= 0; i--)

lcnt++;

}//尋找右邊偶數的個數

int rcnt = 0;

for(int i = rr + 1; i < numssize; i++)

rcnt++;

}ret += (lcnt + 1) * (rcnt + 1);

//更新下乙個奇數

bool find = false;

for(int i = ll + 1; i < numssize; i++)

}if(find == false)

//啟動下一次尋找

rr++;

odd_cnt--;

}return ret;

}

測試結果如下:

我還編寫了考慮優化的**:

#define mmax(a, b)        ((a) > (b)? (a) : (b))

#define mmin(a, b) ((a) < (b)? (a) : (b))

#define is_odd(a) ((a) % 2 == 1)

//【演算法思路】雙指標。

intnumberofsubarrays

(int

* nums,

int numssize,

int k)}if

(count < k )

index[count +1]

= numssize;

for(

int i =

1; i <= count - k +

1; i++

)return sum;

}

以下是執行結果,可以看到速度有所提公升但不明顯,排名提公升不少可惜還是沒有到達90%。

這是我發的第一篇與leetcode有關的博文,以後多嘗試嘗試嘛hhh。

leetcode 1248 優美子陣列

給你乙個整數陣列 nums 和乙個整數 k。如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是 優美子陣列 請返回這個陣列中 優美子陣列 的數目。示例 1 輸入 nums 1,1,2,1,1 k 3 輸出 2 解釋 包含 3 個奇數的子陣列是 1,1,2,1 和 1,2,1,1 ...

Leetcode 1248 統計 優美子陣列

給你乙個整數陣列 nums 和乙個整數 k。如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是 優美子陣列 請返回這個陣列中 優美子陣列 的數目。示例 1 輸入 nums 1,1,2,1,1 k 3 輸出 2 解釋 包含 3 個奇數的子陣列是 1,1,2,1 和 1,2,1,1 ...

LeetCode1248 統計 優美子陣列

給你乙個整數陣列 nums 和乙個整數 k。如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是 優美子陣列 請返回這個陣列中 優美子陣列 的數目。示例 1 輸入 nums 1 1,2 1,1 k 3輸出 2 解釋 包含 3 個奇數的子陣列是 1,1,2,1 和 1,2,1,1 這...