劍指offer筆記

2021-10-03 17:24:05 字數 2501 閱讀 2737

對於這道題來說,書上的和leetcode上的是不一樣的。

在leetcode上,是一位陣列中判斷是否有重複數字,有的話任意返回乙個就行。這個思路也有兩個:

1.先用乙個排序如快排o(nlogn),然後就判斷相鄰元素是否相等,若相等直接返回即可。

2.用乙個集合set,遍歷陣列放進去,因為集合有唯一性,若哪個在新增的時候,新增失敗,說明這個已經在集合中了,就意味著重複。需要注意的是set沒有push_back。

class solution 

else

}return 0;

}};

3.因為陣列裡的數字都在0 - n-1之間,令每個數字對應到下標,最後如果得到nums[i] == nums[nums[i]]即出現重複值。

class solution 

}return 0;

}};

在書上是在二維陣列中查詢,對應leetcode上的面試題4,且陣列是滿足從左到右,從上到下遞增的,然後給定乙個數,判斷這個數是否在陣列中。這個的解法不好想到,首先從右上角的數字開始,將其與給定的數比較,若大於給定數,說明這一列的數都大於,刪除這一列即可;小於則刪除這一行,以此類推即可。c++**如下:

class solution 

int m = matrix.size();

int n = matrix[0].size();

int row = m - 1;

int col = 0;

while (row >=0 && col < n)

else if(matrix[row][col] > target)

else

}return false;

}};

注意是size(),還有m和n的表示方法,還有matrix[row][col]這個表示方法。

此題是讓把字串中的所有空格替換成"%20"。遇到此題,首先考慮的是:

字串變長了,原來的記憶體是否能放下?假設能放下,記憶體足夠。

思路一是從前到後遍歷替換,遇到空格就換。但後果是後面的字元每次都要移動,o(n^2)。

思路二是從後向前遍歷替換,o(n),先遍歷一遍,得知有多少個空格,則新字串就為源字串數加上2倍的空格數,書上**:

class solution 

int newlength = originallength + numberofblank;

if (newlength > length) return ;

int indexoforiginal = originallength;

int indexofnew = newlength;

while(indexoforiginal >= 0 && indexofnew > indexoforiginal)

else

s[indexofnew --] = s[indexoforiginal];

-- indexoforiginal;}}

};

其實還有更簡單的**(清清楚楚):

class solution 

return res;

}};

題目描述很直接,沒什麼需要注意的。

方法一 :使用棧,因為棧有現進後出的性質,先將元素壓入棧中,再彈出,就實現了反轉。時間和空間都是o(n)。

class solution 

while(!st.empty())

return res;

}};

方法二:使用遞迴,時間和空間都是o(n)。

class solution 

};

方法三:從頭到尾列印鍊錶到陣列中,返回反轉後的結果即可。時間和空間都是o(n)。

class solution 

reverse(res.begin(), res.end());

return res;

}};

這道題是給出前序遍歷和中序遍歷的結果,要求重建出二叉樹。首先,前序是(根左右),中序是(左右根)。

先找到preorder中的起始元素作為根節點,在inorder中找到根節點的索引mid;那麼,前序中第乙個是根節點,preorder[1:mid + 1]為左子樹,preorder[mid + 1:]為右子樹;中序中,inorder[0:mid]為左子樹,mid為根節點,inorder[mid + 1:]為右子樹。遞迴建立二叉樹。

下面這個做法真巧妙。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

};

用中序和後序重建二叉樹:程式會溢位

class solution 

};

劍指offer筆記整理

本部落格借鑑了這篇部落格的版面設計,以及部分解題思路,主要用於個人劍指offer的刷題過程中的筆記整理。鍊錶部分 8道 劍指offer 三 從尾到頭列印鍊錶 劍指offer 十四 鍊錶中倒數第k個結點 劍指offer 十五 反轉鍊錶 劍指offer 十六 合併兩個排序的鍊錶 劍指offer 二十五 ...

劍指offer學習筆記

筆記主要記錄方法和知識點 知識點1 負數與補碼 乙個參考 知識點2 移位操作 右移 變小 按位 操作 知識點3 0xffffffff表示32位 1 o logn 的方法 非遞迴的快速冪,用到二進位制表示。在迴圈內注意base base。兩個指標等間距一起走。想明白斷開鍊錶這個事情,相當於操作是在原有...

劍指offer刷題筆記

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,5 3 7 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。struct treenode class solution treenode kthnode treenode proot,int k 非遞迴實現 class solution...