原创 LeetCode 劍指offer Q51數組中的逆序對個數

思路 暴力解法很簡單但是效率很低,通不過。 通過歸併排序進行統計逆序的個數。 首先歸併排序包括劃分和合並兩個步驟。合併就是將兩個已經排好序的子數組進行有序合併。有序合併的代碼是一個簡單題。就是從頭到尾倆倆比較即可。 if(left

原创 LeetCode 劍指offer Q40 最小的k個數(大根堆、快排、計數排序法)

package algorithm.jianzhiOffer; public class Q40 { //第一種大根堆 /** * 首先將前k個元素生成一個大根堆,然後對後面的元素進行處理,將堆頂和每

原创 leetCode Q68 -l二叉搜索樹的最近公共祖先

思路 這一題思路相對一般的二叉樹而言比較簡答。因爲是二叉搜索樹,肯定遵循左<中<右,因此我們可以使用遞歸對當前root、p、q的val進行大小判斷,如果pq的值都小於root,那麼可以判斷pq的最近公共祖先還在root.left中

原创 LeetCode劍指offer Q66構建乘積數組

思路 不能使用除法導致要想一個好的辦法 用對稱數組解決。 設 int left[]=new int[a.length],right[]=new int[a.length]; left用來存放每個元素包括自己及其左邊所有元素的乘積,

原创 LeetCode 劍指offer Q68 -ll 二叉樹的最近公共祖先

思路 接着67題。這一題就是一般情況,就是一棵普通的二叉樹沒有順序。那如何求解呢? 比較容易想到的就是用dfs找到到達pq的兩條路徑,然後進行比對找到最近的相同點。但是這種方法在遞歸完之後還要進行處理效率比較低。 我們設計

原创 LeetCode 劍指offer Q65不用+-*/做加法運算

思路 本題實際就是考察的位運算 假設a=4,b=5 二進制 a 0100 b 0101 其實在不考慮進位的情況下 a+b其實就是a^b=0001 但這個和a+b的結果相差了個進位的情況 a+b=9 1001 a&b.

原创 LeetCode 劍指offerQ62圓圈中的最後一個數

思路 看了解答區的大神的解答。採納了一種。 反推法。 細節先不寫了,沒時間 後面補上。 代碼 class Solution { public int lastRemaining(int n, int m) {

原创 LeetCode 劍指offerQ56 -l 數組中數字出現的次數

思路 首先,我們現瞭解^異或這個位運算符,它有以下的性質: 一個數和自己異或結果爲0 任何數和0異或結果都是本身 不懂的百度 因爲這個數組是包含兩個不同的數假設爲a和b,還有若干個出現兩次的數。所以我們通過^運算,可以將若干個

原创 LeetCode 劍指offer Q52 兩個鏈表的第一個公共節點

思路 這一題雖然是一個簡單題,但是題目要求空間複雜度最好爲o(1),這就斷結了使用set的方法了。 浪漫雙指針法: 假設有headA和headB兩個鏈表,設置兩個工作指針A,B,假設他們公共部分長度爲c,headA長度爲a+c,h

原创 LeetCode Q300 最長上升子序列

思路 最長上升、最長不下降、最長下降子序列等等類似的題目求子序列長度的題基本都是使用dp來解。還要注意題目中是否指定了是連續子序列還是沒有限制,若是連續的子序列就要注意dp代表的含義。還有的題目會使用刪除某些數字來獲得子序列來反向

原创 LeetCode劍指offer Q42連續子數組的最大和

思路 類似於這種可分成子問題的問題,且子問題不相同的情況,一般使用動態規劃。本題要求連續的子序列的最大和,那麼就想到設dp[i]爲以num[i]結尾的連續子序列的最大長度,這樣再進行遞推公式的推導。因爲要求的最大長度且題目中說明數

原创 LeetCode 劍指offer Q43 1-n中整數中1出現的次數

思路 這一題我也懵逼,暴力針對每個數字進行判斷肯定是超時的。所以只能找規律了。看了題解的答案。總結一下: 首先針對傳進來的數字n,求解他的三個參數: 他的最高位high是哪個數字 pow=Math.pow(10,他的位數-1),

原创 LeetCode Q169 、劍指offerQ39 多數元素 三種方式(摩爾投票)

思路 本題要求衆元素,有三種方式: 通過HashMap或者字典等方式,對序列中每個數字進行計數,最後返回出現次數超過n/2的那個數。這種方法複雜度較大,因爲涉及到了map的調用。 對序列進行排序,排序後,那個出現次數超過一半的元