Python 用了很多年,但是對于數(shù)據(jù)結(jié)構(gòu)與算法一直理解不夠深刻婆廊。近期想系統(tǒng)性的過一遍迅细,順道練習C++。所有的題目會先用Python寫一遍淘邻,再用C++寫一遍茵典。
D1 數(shù)組理論基礎(chǔ)??
文章鏈接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
題目建議:?了解一下數(shù)組基礎(chǔ),以及數(shù)組的內(nèi)存空間地址宾舅,數(shù)組也沒那么簡單统阿。
?704.?二分查找?
題目建議:?大家能把?704?掌握就可以,35.搜索插入位置?和?34.?在排序數(shù)組中查找元素的第一個和最后一個位置?贴浙,如果有時間就去看一下,沒時間可以先不看署恍,二刷的時候在看崎溃。
先把?704寫熟練,要熟悉?根據(jù)?左閉右開盯质,左閉右閉?兩種區(qū)間規(guī)則?寫出來的二分法袁串。
題目鏈接:https://leetcode.cn/problems/binary-search/
文章講解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
博客心得:左閉右開 [left, right)? 和左閉右閉 [left, right] 的區(qū)別是之前沒有考慮過的。The devil in the details.?
先看了博客呼巷,以為對于二分查找很熟悉了囱修,但是摳到細節(jié),發(fā)現(xiàn)沒有總結(jié)過思路王悍,先練習了一下左閉右開的寫法破镰,發(fā)現(xiàn)對于指針的位置判斷不夠精確竟然也會引起報錯。以前的思路是:模糊的盡可能多的包含被查找的區(qū)間压储,這樣不會遺漏鲜漩,可是這樣也帶來了新的問題: 永遠都無法收斂到目標位置,無法結(jié)束循環(huán)集惋。debug的時候孕似,發(fā)現(xiàn)這種不精確的寫法在第二輪就找到了目標值,但是沒有終止循環(huán)刮刑。(highlight: line13-14)
Python 寫法一: 左閉右開
Python 寫法二: 左閉右閉
第一種寫法理解了以后喉祭,再寫左閉右閉就簡單了,關(guān)鍵是把區(qū)間節(jié)點搞清楚雷绢,區(qū)別在于line24,27,29, 注釋標記的新區(qū)間范圍是關(guān)鍵泛烙。整體感覺方法二比較直觀,區(qū)間范圍就是寫出來的位置翘紊,不用繞一下看是否需要把左右端點寫入新的區(qū)間胶惰。
C++ 寫法一: 左閉右開
看了一下C++基礎(chǔ)教程:https://www.runoob.com/cplusplus/cpp-variable-types.html
實操寫起來和python邏輯一致,主要是語法練習霞溪,理論教程看一遍領(lǐng)悟不深孵滞,真正開始用起來還是面向Google編程中捆。
cpp和python的區(qū)別:在首次使用變量時,需要申明每一個變量的類型坊饶;cpp中的else if 對應python中的elif;? 每一行結(jié)束以分號(;)為標志泄伪。windows調(diào)試cpp需要配置環(huán)境,暫時先寫leetcode平臺版本匿级。
C++寫法二: 左閉右閉
27.?移除元素
題目建議:??暴力的解法蟋滴,可以鍛煉一下我們的代碼實現(xiàn)能力,建議先把暴力寫法寫一遍痘绎。?雙指針法?是本題的精髓津函,今日需要掌握,至于拓展題目可以先不看孤页。?
題目鏈接:https://leetcode.cn/problems/remove-element/
文章講解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
視頻講解:https://www.bilibili.com/video/BV12A4y1Z7LP
這個題目最近做過尔苦,補充一個時間復雜度O(n), 空間復雜度O(n)的思路行施,單指針允坚,每次都修改當前指針及其后面所有的元素。注意審題蛾号,需要返回保留元素k的稠项,也就是循環(huán)結(jié)束后的slow指針。
快慢指針還是比較直觀的鲜结,Python寫法如下:
C++ 寫法如下:
C++中換成了用forloop寫展运,這樣不用在每次循環(huán)對fast指針+1, 更簡潔一些。
另外嘗試了新的vector的size的獲取方式:1. size(nums); 2 nums.size();?
vector.size()的返回值是vector動態(tài)數(shù)組容器的尺寸大小精刷,也就是內(nèi)部元素個數(shù)乐疆;nums.size() 是 vector 類的成員函數(shù),size() 是一個模板函數(shù)贬养,可以用于任何有size成員的容器挤土;成員函數(shù)(nums.size())使用更廣泛一些。
另: size/sizeof/length 的區(qū)別:?https://blog.csdn.net/2303_79299383/article/details/134684749?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-134684749-blog-121202223.235%5Ev40%5Epc_relevant_3m_sort_dl_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-134684749-blog-121202223.235%5Ev40%5Epc_relevant_3m_sort_dl_base3&utm_relevant_index=6