題目描述:給你乙個整數陣列 nums 和乙個整數 k。
如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是「優美子陣列」。
請返回這個陣列中「優美子陣列」的數目。
1 <= nums.length <= 50000思路:參考了題解,使用雙指標。因為奇數的數量k是固定的,所以如果超出數量左指標右移,如果少於數量右指標右移,如果數量相等統計左指標左側0數量的個數,右指標右側連續0數量的個數。1 <= nums[i] <= 10^5
1 <= k <= nums.length
可行的優化方法:可以記錄每個奇數左右相鄰的連續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 這...