原创 調整數組使得奇數元素位於偶數元素之前(相對位置不變)

調整數組,使得奇數元素位於偶數元素之前,且相對順序不變。 解析:冒泡排序思想,比較當前元素和下一個元素,如果當前元素是偶數且下一個元素爲奇數,交換這兩個數。每次冒泡都會使得最後一個偶數在正確的位置。 void reOrderArray(v

原创 面試中常見鏈表問題7:反轉鏈表2

給定一個單鏈表和兩個位置m與n,把鏈表中從m到n位置的元素反轉。比如說1->2->3->4->5->NULL,m = 2和n = 4,返回1->4->3->2->5->NULL。ListNode* reverseBetween(L

原创 面試中常見鏈表問題13:迴文鏈表

給定一個單鏈表,判斷該鏈表是否爲迴文序列。要求時間複雜度爲o(n),空間複雜度爲o(1)。 解析:(1)把鏈表分割成前後兩部分。(2)反轉前半部分鏈表。(3)判斷前後兩部分鏈表是否相等。bool isPalindrome(

原创 集合中的子集2(含有重複元素)

給定一個集合,含有重複元素,求這個集合的子集,例如:集合{1,2,2},子集爲{},{1},{2},{1,2},{2,2},{1,2,2}。 解法一:遞歸void subsetsWithDup(vector<vector<

原创 面試中常見鏈表問題11:在鏈表中刪除給定元素值的節點

給定一個單鏈表和一個val,刪除鏈表中所有值爲val的節點,比如:1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6,val = 6,則返回1 --> 2 --> 3 --> 4 --> 5。ListNod

原创 面試中常見鏈表問題10:交叉鏈表的第一個公共節點

給定兩個鏈表,如果這兩個鏈表相交,則返回第一個相交的頂點,如果不相交,則返回空。比如 A:          a1 → a2                    ↘                      c1 → c2 →

原创 面試中常見鏈表問題8:重排鏈表

給定一個單鏈表:L0->L1->...->Ln-1->Ln,重新排序以後返回L0->Ln->L1->Ln-1->L2->Ln-2...。 解析:(1)把單鏈表分割爲前後兩部分。(2)把後一部分鏈表反轉。(3)把兩部分鏈表交

原创 集合中的子集(三種方法)

給定一個集合,求出這個集合的所有子集,比如:集合{1,2,3},子集爲{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。 解法一:遞歸void subsets(vector<vector<i

原创 有序鏈表轉換爲平衡二叉樹(BST)

有序單鏈錶轉換爲平衡二叉樹。TreeNode *buildTree(ListNode *&list,int n) { if (n == 0)

原创 面試中常見鏈表問題12:單鏈表反轉(遞歸)

遞歸反轉單鏈表。ListNode *reverseList(ListNode *head,ListNode *pNewHead) { if(head == NULL) return pNewHead; ListNode *next

原创 棧的壓入和彈出序列

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可

原创 面試中常見鏈表問題6:劃分鏈表

給定單鏈表和一個k值,把小於k值節點排在大於等於k值節點之前。比如說1->4->3->2->5->2和 x = 3,則返回1->2->2->4->3->5。ListNode* partition(ListNode* head, i

原创 連續子數組的最大乘積

題目:給定一個數組,求出這個數組中連續子數組的最大乘積,例如{2,3,-4,5},最大乘積爲2*3=6。 解析:動態規劃思想,保存兩個臨時變量maxProduct和minProduct,這兩個臨時變量分別存儲,以當前位置結

原创 面試中常見鏈表問題9:對單鏈表進行插入排序

給定一個單鏈表,對該鏈表進行插入排序。ListNode* insertionSortList(ListNode* head) { if (head == NULL || head->next == NULL) return hea

原创 判斷二叉樹是否爲平衡二叉樹(BST)

給定一個二叉樹,判斷此樹是否爲平衡二叉樹。平衡二叉樹,根節點的值小於右孩子節點的值,且大於左孩子節點的值。 遞歸方法:bool isValidBST(TreeNode *root, TreeNode *&pre) { if (root