網(wǎng)站購物車怎么做4001688688人工服務
本文涉及的基礎知識點
二分查找算法合集
本題不同解法
包括題目及代碼 | C++二分查找算法:132 模式解法一枚舉3 |
C++二分查找算法:132 模式解法二枚舉2 | |
代碼簡潔 | C++二分查找算法:132 模式解法三枚舉1 |
性能最佳 | C++單調(diào)向量算法:132 模式解法三枚舉1 |
代碼更簡潔 | C++二分查找算法:132模式枚舉3簡潔版 |
分析
時間復雜度
總時間復雜度O(nlogn),枚舉3時間復雜度O(n),查詢2是否復雜度O(logn)。
思路
如果有多個候選1,選取最小的那個,所以我們不需要記錄所有的1,只需要記錄最小值iLeftMin。2必須大于iLeftMin,且小于3。
也就是setRight中第一個大于iLeftMin的數(shù),是否小于nums[j]。
核心代碼
class Solution{
public:bool find132pattern(vector<int>&nums) {m_c = nums.size();if (m_c < 3){m_iIndex3 = -1;return false;}int iLeftMin = nums.front();std::multiset<int> setRight(nums.begin()+2,nums.end());for (int j = 1; j + 1 < m_c; j++){auto it = setRight.upper_bound(iLeftMin);if ((setRight.end() != it)&&(*it < nums[j])){m_iIndex3 = j;return true;}iLeftMin = min(iLeftMin, nums[j]);setRight.erase(setRight.find(nums[j+1]));}return false;}vector<int> m_v2To1;//v[i]等于j表示nums[i] >=nsum[j],如果有多個合法的j,取最小值,如果不存在,v[i]=m_c。int m_iIndex3 = -1;int m_c;
};
測試用例
template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}
template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
Assert(v1[i], v2[i]);
}
}
int main()
{
vector nums;
bool res;
{
Solution slu;
nums = { 3,5,0,3,4 };
res = slu.find132pattern(nums);
//Assert(vector{5, 0, 5, 2, 0}, slu.m_v2To1);
Assert(1, slu.m_iIndex3);
Assert(true, res);
}
{
nums = { 1 ,2, 3,4 };
res = Solution().find132pattern(nums);
Assert(false, res);
}
{
Solution slu;
nums = { 3,1,4,2 };
res = slu.find132pattern(nums);
//Assert(vector{4, 4, 0, 1}, slu.m_v2To1);
Assert(2, slu.m_iIndex3);
Assert(true, res);
}
{
Solution slu;
nums = { -1,3,2,0 };
res = slu.find132pattern(nums);
//Assert(vector{4, 0, 0, 0}, slu.m_v2To1);
Assert(1, slu.m_iIndex3);
Assert(true, res);
}
{
Solution slu;
nums = { 1, 4, 0, -1, -2, -3, -1, -2 };
res = slu.find132pattern(nums);
//Assert(vector{4, 0, 0, 0}, slu.m_v3To1);
//Assert(5, slu.m_iIndex3);
Assert(true, res);
}
{
Solution slu;
nums = { 2};
res = slu.find132pattern(nums);
//Assert(vector{5, 0, 5, 2, 0}, slu.m_v2To1);
Assert(-1, slu.m_iIndex3);
Assert(true, res);
}
//CConsole::Out(res);
}
擴展閱讀
視頻課程
有效學習:明確的目標 及時的反饋 拉伸區(qū)(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771
如何你想快
速形成戰(zhàn)斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176
相關下載
想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653
我想對大家說的話 |
---|
聞缺陷則喜是一個美好的愿望,早發(fā)現(xiàn)問題,早修改問題,給老板節(jié)約錢。 |
墨子曰:事無終始,無務多業(yè)。也就是我們常說的專業(yè)的人做專業(yè)的事。 |
如果程序是一條龍,那算法就是他的是睛 |