問題1 有序矩陣+右上角查找
方法有二
- 暴力查找
- 右上角查找
問題變形:尋找第k小的數據
方法有二
- 暴力遍歷然後排序
- 右上角查找+二分查找
參考這個鏈接leetcode 668. Kth Smallest Number in Multiplication Table 有序矩陣搜索 + 右上角二分搜索
問題02 字符串地址
str1和str2會自動分配空間,所以地址是不同的
但是str3和str4其實是相同的
—->寫時複製
—->Java的StringBuilder StringBuffer String
在這方面運行速度快慢爲:StringBuilder > StringBuffer > String
- String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量;
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的
問題03 替換空格
方法有二
- 直接暴力移動替換,複雜度O(n*n)
O(n),先掃描空格數量計算替換後的字符串數量,然後遍歷替換,省去了字符串的移動。注意要從後向前遍歷
如下圖:
—-》合併k個有序的數組
依次合併會超時,很費時間;
應該折半兩兩合併,知道得到最後結果
問題04 從尾到頭打印鏈表
方法有二
- DFS深度優先遍歷
- 使用棧
問題05 構建二叉樹
直接參考這個博客leetcode 297. Serialize and Deserialize Binary Tree 二叉樹的序列化和反序列化 + 深度優先遍歷DFS
問題06 兩個棧實現一個隊列
進隊時,壓入stk1。
出隊時,stk2彈出。
stk2爲空時,stk1倒入stk2。兩次逆序恢復了原序。
參考這個博客leetcode 232. Implement Queue using Stacks 雙棧實現隊列
1)取棧頂元素: 返回有元素的隊列的首元素
2)判棧空:若隊列a和b均爲空則棧空
3)入棧:a隊列當前有元素,b爲空(倒過來也一樣)則將需要入棧的元素先放b中,然後將a中的元素依次出列併入列倒b中。(保證有一個隊列是空的)
4)出棧:將有元素的隊列出列即可。
參考這個博客leetcode 225. Implement Stack using Queues 雙隊列實現棧