給定一個數組,我想查找所有最小元素爲x的子陣列的數量。 其中x是一個給定的數字,可能存在或可能不存在於數組中,或者數組x中可能出現多次出現的數字。 O(n)實施將是優選的。其最小元素是特定給定數字的子陣列的數量
-3
A
回答
0
你有一個矢量vec已知的大小n。然後,對vec(i)的值與x的值進行比較。一旦找到一個高於x的值,該值可以是一組包含x作爲最小值的子向量的下界。你繼續超過元素運行VEC,並有兩種情況:
1)你發現一個元素比X較小,那麼這個下界不再有效了,你繼續搜索。
2)你發現X,讓您保存的相對位置對於下限,並繼續運行在指數直到找到一個值比X更小,讓你有上限。邊界包含一組子數組,其中x是最小值。計算所有可能的組合。
無論您是處於第1種情況還是第2種情況,您都會繼續運行索引,直到找到另一個有效範圍,或者直到達到向量的末尾。
int x;
std::vector<int> vec(n);
unsigned int l_bound = n; //initialize n to an invalid index
unsigned int r_bound;
unsigned int x_pos = n; //initialize x to an invalid index
unsigned int n_sub_arrays = 0;
// here we do something to assign values to vec and x
// here we count the number of subarrays
for (unsigned int i = 0; i<n; ++i)
{
if (vec(i) >= x)
{
if (l_bound == n) // if we are at the first value higher that x
{
l_bound = i;
if (vec(i) == x) // if this value is already x
{
x_pos = i;
}
}
}
else
{
if (x_pos == n) // x is not inside the bounds
{
l_bound = n; // the bounds are not valid
}
else
{
r_bound = i-1;
n_sub_arrays += (x_pos - l_bound+1)*(r_bound-x_pos+1);
l_bound = n;
x_pos = n;
}
}
}
+0
我認爲這隻適用於排序數組的情況 – algorithmist
+0
@algorithmist我在開始時就誤解了這個問題。我理解「第一個組件是數值* x *的子數組」。我已經更新瞭解決方案。 – sebas
相關問題
- 1. 包含所有給定元素的容器的最小數量
- 2. 三維數組中特定元素序列的最大數量
- 3. 元素在給定範圍內的子矩陣中唯一元素的數量?
- 4. 從給定數量的元素獲得陣列的所有獨特組合
- 5. 最小窗口用於在陣列的給定數字
- 6. 使特定元素是先在陣列
- 7. 子陣列具有特定值時刪除數組元素
- 8. 計算列表中其他元素之間特定元素的數量
- 9. 給定數組中數組元素的最長重複子集
- 10. jQuery獲取具有特定參數的子元素的數量
- 11. 測試給定數組的子陣列
- 12. 計數陣列中的特定變量
- 13. 2D陣列的最小/最大元素
- 14. 在SQL中,選擇其計數超過給定數列的獨特元素
- 15. 不大不小的SKSpriteNode陣列根據特定的元素
- 16. python中給定數字的最大素數因子
- 17. 陣列中有多少數字小於給定數字?
- 18. 計數在numpy的陣列的元素數量是每一個其他元件
- 19. 以給定字母/數字開頭的向量中的元素
- 20. 給定數組中2個元素之間的最小距離
- 21. 獲取其中數量最多的項目從給定的陣列相匹配
- 22. 計數具有一定值,其中值是子陣列的總數的變量
- 23. 查找我陣列中特定元素的所有數據
- 24. 陣列的最大和最小數字
- 25. 我們如何找到給定子矩陣中不同元素的數量?
- 26. 如何將變量分配給數組中的特定元素?
- 27. Set的擴展其中元素是特定類型的數組
- 28. 最近的素數給定的整數
- 29. 二維整數陣列中元素的最大數量
- 30. javascript-檢查數組中的元素是否是特定變量
常見問題 - 您是否試圖自己解決這個問題?你能向我們展示你最成功的嘗試,或者甚至僅僅分享一些你認爲的東西的想法,這絕對不會在試圖自己解決它的時候起作用嗎? – Dukeling
以及我工作的算法因給定數字x的多次出現而失敗。我會搜索數組x中的數字x,然後計算右邊大於x的數字(讓n個這樣的數字在那裏)以及左邊的數字大於x(讓m這樣的數字在那裏)。 ans將是(m + 1)*(n + 1) – algorithmist
CodeChef剛開始的比賽較長。這個問題與其中一個問題太相似了:[SUBMIN](http://www.codechef.com/FEB14/problems/SUBMIN)。準備更多的嘗試濫用SO作弊作用... –