原创 66、加一

問題描述 問題分析 只是一道水題,練習一下BigInteger的用法。 解法:BigInteger 時間複雜度:O( n ),其中n表示數組的長度。 Java代碼 import java.math.BigInteger;

原创 38、報數

問題描述 問題分析 分析題目,是一個簡單模擬的題目,主要難度在於理解題意。 題意: 第一個數是1; 由於上一個數“1”是1個1,所以第二個數是11; 由於上一個數“11”是2個1,所以第二個數是21; 由於上一個數“21”是先

原创 28、實現strStr()

問題描述 問題分析 此題有很多解法,直接調用indexOf方法、KMP、BF、BM等等。indexOf方法背離原意;最經典的是KMP解法,效率高,不過過於複雜;於是本題決定採用在實際情況中效果較好且理解簡單的算法,即 Sunda

原创 69、x的平方根

問題描述 問題分析 如果直接用暴力遍歷法。會超時。考慮使用二分查找法(採用二分!!不是分治!!!搞清楚兩者的區別!!)。 二分查找沒有什麼可說的。說一下這個題目的一些坑: 使用 x/mid < mid 而不是 mid*m

原创 100、相同的樹

問題描述 問題分析 水題,考察基礎的遞歸。 解法:遞歸 時間複雜度:O( n ),其中n表示樹節點的個數。 Java代碼 package com.company; public class Main { sta

原创 67、二進制求和

問題描述 問題分析 簡單模擬一下二進制相加的過程即可,思路如下: 兩個字符串長度對齊:短的字符串前面補0,直到和長的字符串對齊。 逐項相加:相加情況只可能是0、1、2、3。 特殊情況處理:頭部若需要進位,那麼得在頭部額外添加一

原创 Arrays.sort()排序算法分析

Arrays.sort()排序算法分析 Arrays.sort()根據入參類型選擇以下排序算法 基本類型數組使用快速排序 對象數組使用歸併排序 原因 使用不同類型的排序算法主要是由於快速排序是不穩定的,而合併排序是穩定的。

原创 108、將有序數組轉換爲二叉搜索樹

問題描述 問題分析 分析題目,由於求的是二叉搜索樹,我們立即想到二叉搜索樹的性質: 左子樹的一切元素都比根節點小,右子樹的一切元素都比根節點大,且所有的子樹左右子樹的節點數相差不超過1個。 結合題目所給的有序數組,很容易想到

原创 107、二叉樹的層次遍歷 II

問題描述 問題分析 分析題目,使用BFS和DFS都可以,這裏使用DFS: 首先構建DFS(當前節點root,層次level, 樹形List, 數值List)。BFS分樹形List和數值List的原因是,按照樹形List的父子結

原创 876、鏈表的中間結點

問題描述 問題分析 分析題目,看到單鏈表且求中間結點,立即推!快慢指針法! 用兩個指針 last 與 fast 一起遍歷鏈表。last 一次走一步,fast 一次走兩步。那麼當 fast 到達鏈表的末尾時,last 必然位於中間

原创 8、字符串轉換整數 (atoi)

問題描述 問題分析 分析題目,此題是數值處理的模擬題。處理邏輯稍微有點複雜,我真是被測試用例搞到自閉了…需要注意的地方有: 關於最大值、最小值的定義: 使用int INT_MIN = Integer.MIN_VALUE;而不是

原创 35、 搜索插入位置

問題描述 問題分析 分析題目,典型的二分查找。 解法:二分查找 時間複雜度:O(logn),其中n表示數組的長度。 Java代碼 class Solution { public int searchInsert(i

原创 47、全排列 II

問題描述 問題分析 分析題目,全排列問題都是用經典的回溯法,這裏可以結合46題一起看,多思考思考這裏的減支思想: 在處理數組中重複元素的時候,要先將數組排序,排序以後在數組重複元素都相鄰在一起。造成重複結果的原因是當前元素和前一

原创 46、全排列

問題描述 問題分析 分析題目,這是一道經典的回溯法題目: backtrack(res, nums, tmp, visited); res是結果集 nums是候選集 tmp是當前路徑 visit是訪問控制集 基本算法思路是 b

原创 26、刪除排序數組中的重複項

問題描述 問題分析 分析題目,主要有兩個要考慮的問題:“如何原地刪除重複元素”,以及“如何計數”。我們知道,在對排序數組進行遍歷時,指針所指的值只會“相等”或者“變大”。若相等,即發現重複元素;否則爲非重複元素。 基於以上思路,