第一次用簡書,注冊登錄快捷,界面像oneNote。
數(shù)組理論基礎(chǔ)
第一時(shí)間想到的就是連續(xù)的一段空間,可以隨機(jī)訪問,添加刪除的時(shí)間復(fù)雜度是o(n),訪問,修改時(shí)間復(fù)雜度o(1) ,看了代碼隨想錄后覺得還能再補(bǔ)充一寫理論,知道但是不會(huì)立馬說出口的。
數(shù)組:連續(xù)空間上 相同數(shù)據(jù)類型 的 集合
java中的二維數(shù)組不是連續(xù)的,類似拉鏈法的形狀

704.二分查找
雖然做過這道題,但是完全不會(huì)想到要用二分查找,思維有很大的開闊空間。
需要學(xué)習(xí)的:二分法的兩種寫法。[ ],[ )
關(guān)于 是否用<= ,<。邊界處理。訣竅在于帶入數(shù)值看是否是合法區(qū)間。
1.左閉右閉。
[1,1]是合法區(qū)間,所以在while時(shí),left=right是可以取到的,所以可以寫成while(left<=right)。
target<middle時(shí),right應(yīng)該換成middle,但這里需要考慮是middle還是middle-1。顯然閉區(qū)間middle是可以取到且已知middle>target了,所以新的right不應(yīng)該包含middle這個(gè)值,即right = middle - 1;
target>middle時(shí),left應(yīng)該換成middle+1。?
2.左閉右開
[1,1)不合法,left=right不能取到,while(left<right)
target<middle時(shí),right應(yīng)該換成middle,但這里需要考慮是middle還是middle-1。顯然開區(qū)間middle是不可以取到的,所以新的right可以包含middle這個(gè)值,即right = middle ;
target>middle時(shí),同理閉區(qū)間可以取到,left應(yīng)該換成middle+1
關(guān)于取中間值,自己實(shí)現(xiàn)的時(shí)候用的是(L+R)/ 2 ,且自己實(shí)現(xiàn)的時(shí)候不能通過,評論區(qū)有人指出這樣會(huì)造成整型溢出,減法則不會(huì)??梢越邮艿臏p法是 L+ (R-L)/2.
27.移除元素
只能想到暴力解法。
nums.erase是o(n)的算法。這里雙指針也是o(n)
需要學(xué)習(xí)的:雙指針。 數(shù)組的元素不能被刪除,只能覆蓋。因?yàn)閿?shù)組所占的區(qū)域已經(jīng)分給它了,而且是連續(xù)的,不能刪除單個(gè)元素。
快慢指針原地修改值。原理是慢指針記錄數(shù)組的長度,快指針遍歷數(shù)組記錄需要更新的數(shù)值,當(dāng)數(shù)值等于val(需要移除的元素)時(shí),則不往新的數(shù)組里加入。