leetcode隨記備忘(3)

2021-10-06 17:49:22 字數 2403 閱讀 6053

除自身以外陣列乘積

這道題不能用除法,所以我們可以從後往前以及從前往後兩次遍歷。由於輸出空間不算空間複雜度,所以可以先把正序的結果放進輸出空間,在逆序的時候對應乘一下就行了,這樣應該就算是o(1)的空間複雜度。**如下:

class

solution

prod =1;

for(

int i = length -

2; i >-1

; i--

)return res;}}

;

最接近的三數之和跟以前做過的3sum幾乎沒有區別,我一開始還在想能不能優化一下迴圈,後來發現太複雜而且好像還不對。就直接3sum的迴圈好了。**如下:

這道題也很簡單。稍微要注意一下的就是以空格作為分隔符的話,最後乙個單詞應該特殊處理一下。**如下

class

solution

string reversewords

(string s)

else h++;}

return s;}}

;

remove nth node from end of list這道題的要求是一次遍歷,那麼使用快慢兩個指標,快的先走n步即可。這裡要注意的邊界條件是如果快的在先走階段後已經到達末尾,那麼證明要刪除的是首節點。**如下:

class

solutionif(

!p)while

(p->next)

q->next = q-

>next-

>next;

return head;}}

;

合併k個有序鍊錶這題值得著重說一下。最容易想到的思路是乙個乙個取出第乙個元素,然後每次取出裡面最小的加入鍊錶。而每次取出最小這個操作可以用優先佇列來實現。這裡要定義一下優先佇列的cmp函式,這個函式的寫法比較奇怪,要記住!其他方面就很簡單了,**如下:

class

solution};

priority_queue

, vector

>

, cmp> heap;

for(

auto list : lists)

while

(!heap.

empty()

)return p-

>next;}}

;

當然這道題也有別的做法。可以用歸併排序的思想,每次歸併一半的鍊錶,最底層是合併兩個鍊錶。這樣也可以,寫起來也簡單。

時間複雜度的話, 二者都是o(nklogk),n是鍊錶的平均長度。因為總共取nk個元素,優先佇列排序的複雜度為logk,歸併排序的複雜度為klogk,底層排序o(n)。空間複雜度的話,優先佇列會多。

fizzbuzz

很簡單的一題,我這裡用兩個數來記錄3和5是否達到倍數的點,這樣省去%的操作,應該能節省不少運算量。另外我之前還以為int轉string是用itos。。。沒有這玩意,用to_string就好。**如下:

class

solution

else

if3 =2;

}else

if(if5 ==0)

else

}return res;}}

;

合併兩個有序陣列因為要把兩個陣列合併到第乙個陣列中去,所以我們使用三個指標分別指向三個陣列的尾部,每次在大陣列尾部放入兩個小陣列尾部最大的乙個。**如下:

class

solution

int p1 = m-1;

int p2 = n-1;

int p3 = n+m-1;

while

(p1 >=

0&& p2 >=0)

else

nums1[p3--

]= nums2[p2--];

}if(p2 >=0)

return;}

};

leetcode隨記備忘(4)

反轉整數 問題並不難,但是在答案那裡看到了很精彩的解法。貼一下別人的解法。相比之下我的按部就班做法就顯得很蠢。class solution return num 2的冪這裡可以用乙個trick。因為2的冪的二進位制中只有乙個1,而 n n 1 可以消去二進位制末尾的0.所以操作一次後判斷是否為0即可...

leetcode隨記備忘(11)

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

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

以往,每個應用程式程序都有自己的虛擬位址空間,通過位址空間的隔離來保證乙個程序不會干擾另乙個程序的執行。但通過驗證託管 可以確保不會訪問不該訪問的記憶體,因此可以乙個單獨的虛擬位址空間內執行多個託管應用程式。由於太多的程序會占用過多的系統資源,損傷系統效能,並限制系統可用的資源。因此在乙個程序中執行...