1. 程式人生 > >LeetCode 思路總結

LeetCode 思路總結

LeetCode思路總結(不定時更新!!!!!!)

1.解題技巧

1.1提升效率

(1)我們在做題過程中可以通過使用更加高效的資料結構,來滿足不同問題的需求。例如為了提高查詢效率,我們可以使用雜湊表減少查詢的時間複雜度,例如在LeetCode第一題中的求解兩數之和,我們可以計算出需要的第二個數,如果存在則返回,不存在就把需要的第二個數放在雜湊表中。
(2)在做c++問題時發現了耗時最少的答案,在提交程式碼頭添加了一段程式,如下:

static const auto __ = []()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr
); return nullptr; }();

自己嘗試了下發現可以從28ms(78%)提升到20ms(99.55%),真的是個神奇的東西,後來晚上找了下資料,以我的理解就是C++為了相容C的輸入輸出,把資料存入記憶體在讀取出來導致效率降低,這段程式碼解除了繫結,提高了效率。
(3)在判斷陣列中數值相等或者其他對數值進行判斷的操作時,可以嘗試使用^(異或運算子),&(與運算子),~(翻轉運算子),會更加方便,例如LeetCode第136題只出現一次的數字。

2.實際函式操作

c++

2.1陣列

c++中的vector容器可以理解為一種可以改變大小的陣列,下面給出常用的操作。

 1. #include <vector> //需引用的標頭檔案
 2. vector<int> vec; //初始化一個空vector
 3. vector<int> vec(10); //初始化成長度為10,元素為0的vector
 4. vector<int> vec(101); //初始化成長度為10,元素為1的vector
 5. vector<int> a(vec);//通過同類型vector賦值
 6. vec.back();//返回vec的最後一個元素
 7. vec.front();//返回vec的第一個元素
 8. vec.clear();//清空vec中的元素
9. vec.empty();//判斷vec是否為空,空則返回ture,不空則返回false 10. vec.size();//返回vec中元素的個數 11. vec.push_back(5);//在vec的最後一個向量後插入一個元素,其值為5 12. vec.insert();//插入函式,還有很多複雜的功能 13. vec.erase();//刪除函式,還有很多複雜的功能 14. unique(vec.begin(),vec.end());//去除重函式,但沒有刪除,只是把重複元素移到後面。**注意!!!是相鄰的重複元素**,而且後面數的是原來的數並不是剩餘的數 15. reverse(vec.begin(),vec.end());// 翻轉函式 16. for (auto& num: nums)// 可以簡潔的遍歷陣列 17. sort(vec.begin(), vec.end());//對vector進行排序 18. accumulate(nums.begin(),nums.end(),10);//對vector進行求和,並再加上10 19. INT_MAX,INT_MIN;// 最大/最小整數 20. vector<vector <int>> vec(10vector<int> (101));//二維陣列初始化

2.2雜湊表

c++中我經常使用unordered_map,unordered_map和map的區別,以我的理解map中對鍵值進行了排序,而unordered_map中是無序的,相對來說unordered_map的效率會更高些。

 1. #include <unordered_map>//需引用的標頭檔案
 2. unordered_map<int, int> m;//初始化一個空unordered_map
 3. m[1] = 1;//賦值key=1,值為1
 4. m.find(key) == m.end();//find實現查詢是否有鍵key存在,返回的是對應迭代器,所以需要加上後面來判斷是否存在
 5. m.size(); //返回有效元素個數 

2.3字串


 1. transform(s.begin(), s.end(), s.begin(), ::tolower);//字串轉化為小寫
 2. isalnum();//判斷是否為字母或者數字
 3. tolower(*left)//單個字元轉換小寫
 4. s1.compare(s2);//比較字串
 5. s.substr(0,4);//擷取字串從位置0開始,往後數4個
 6. s1.find_first_of(s2);//查詢s2任意一個字元,首次在s1出現的位置
 7. s1+s2 或 s1.append(s2);//字串拼接

2.4棧和佇列


 1. stack<int> s;//定義一個棧
 2. s.pop();// 出棧,注意不返回元素
 3. s.top();//訪問棧頂元素
 4. s.size()//棧大小

2.5set集合

set和map區別在於map儲存的是一對資料,有鍵值有元素。set只儲存元素。

Python

 1. set()//可以轉為無序,不重複的集合型別,可進行交,並等集合操作
 2. Counter()//實現計數操作,即每個元素出現幾次