leetcode隨記備忘(4)

2021-10-06 18:33:12 字數 1906 閱讀 8119

反轉整數

問題並不難,但是在答案那裡看到了很精彩的解法。貼一下別人的解法。相比之下我的按部就班做法就顯得很蠢。

class

solution

return num;}}

;

2的冪這裡可以用乙個trick。因為2的冪的二進位制中只有乙個1,而**n & (n-1)**可以消去二進位制末尾的0.所以操作一次後判斷是否為0即可。

class

solution

};

新21點

典型的動態規劃問題,用一維的dp陣列就能解決。但是如果用對於前面的結果求和的方式來計算下乙個dp值的話會超時。又因為都是求和,所以考慮用前乙個的值來計算後乙個。具體的狀態轉移關係見**。

class

solution

for(

int i = k+

1; i < max1; i++

)for

(int i = k; i <= n; i++

) res +

= dp[i]

;return res;}}

;

鍊錶排序要求o(nlogn)的時間複雜度和常數空間複雜度。思路應該使用歸併排序。歸併排序分為兩個問題:二分當前鍊錶&合併兩個鍊錶。前者可以使用快慢指標來完成,後者之前已經做過這種題了。當然後者也可以用遞迴完成。這裡主要提的問題是歸併的寫法,我們需要3個指標:快慢以及慢的前乙個。然後每次遞迴呼叫的引數是head和slow,同時通過慢的前乙個來將前一半鍊錶的尾部置空,將其**為兩個陣列。這裡的**來自站內。

class

solution

pre-

>next =

nullptr

;auto ptr1 =

sortlist

(head)

;auto ptr2 =

sortlist

(slow)

;auto res =

merge

(ptr1, ptr2)

;return res;

}

listnode*

merge

(listnode* node1, listnode* node2)

else}}

;

搜尋旋轉陣列這道題挺經典的,拿來再做一下。我的想法是二分之後要麼還是旋轉陣列,要麼就是單調陣列,分別調乙個遞迴函式。這裡判斷條件可以再優化一點,就是第乙個比較的應該是nums[mid]和nums[low]的大小,這樣可以判斷陣列是旋轉前還是旋轉後長,應該好一點。這裡的**寫的比較複雜,也算是對自己的乙個挑戰。還好是基本沒什麼bug就ac了。**如下:

class

solution

else

if(nums[mid]

> target)

}return-1

;}inthelper

(vector<

int>

& nums,

int target,

int low,

int high)

}else

}return-1

;}intsearch

(vector<

int>

& nums,

int target)

};

這裡helper處理的是帶有旋轉情況的陣列,bs處理的是單調陣列。

leetcode隨記備忘(3)

除自身以外陣列乘積 這道題不能用除法,所以我們可以從後往前以及從前往後兩次遍歷。由於輸出空間不算空間複雜度,所以可以先把正序的結果放進輸出空間,在逆序的時候對應乘一下就行了,這樣應該就算是o 1 的空間複雜度。如下 class solution prod 1 for int i length 2 i...

leetcode隨記備忘(11)

求和路徑 想法是先求樹高,然後對樹做乙個遍歷,對於每乙個節點,用乙個陣列儲存路徑上的所有節點的值,每次對陣列求和,如果恰好等於sum就將結果 1.在這個過程中,傳入當前節點的高度。路徑的陣列只需要乙個,它恰好會隨著遍歷的過程更新。如下 class solution intget high treen...

《 Ne框架程式設計》隨記 4

問 這段 裡有多少次裝箱操作?這裡首先建立了乙個未裝箱的int值型別 v 並將其初始化為4,然後,又建立了乙個object引用型別 o 並希望將其指向v,但是因為引用型別必須指向託管堆中的物件,所以會產生適當的il 將v進行裝箱,並將v的裝箱 拷貝 的位址存放在o中,隨後123被放入未裝箱的值型別v...