除自身以外陣列乘積
這道題不能用除法,所以我們可以從後往前以及從前往後兩次遍歷。由於輸出空間不算空間複雜度,所以可以先把正序的結果放進輸出空間,在逆序的時候對應乘一下就行了,這樣應該就算是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
以往,每個應用程式程序都有自己的虛擬位址空間,通過位址空間的隔離來保證乙個程序不會干擾另乙個程序的執行。但通過驗證託管 可以確保不會訪問不該訪問的記憶體,因此可以乙個單獨的虛擬位址空間內執行多個託管應用程式。由於太多的程序會占用過多的系統資源,損傷系統效能,並限制系統可用的資源。因此在乙個程序中執行...