演算法題 LeetCode刷題(五)

2022-07-28 20:27:16 字數 3819 閱讀 9871

資料結構和演算法是程式設計路上永遠無法避開的兩個核心知識點,本系列【演算法題】旨在記錄刷題過程中的一些心得體會,將會挑出leetcode等最具代表性的題目進行解析,題解基本都來自於leetcode官網(本文是第五篇。

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最後乙個位置。

示例:

輸入: [2,3,1,1,4]

輸出: true

解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後乙個位置。

貪心演算法

方法**:

這裡考慮用貪心演算法解決:對於乙個陣列,我們在每個位置都有乙個它可以到達的最遠位置,拿示例來說,記錄max為可以到達的最遠位置,並且遍歷的過程中實時更新,那麼在i=0時,max=0+a[0]=2,i=1時,max=max(2,1+a[1])=4,...

這樣只要其中更新max的時候發現max+1大於陣列長度就可以了

函式頭:boolean canjump(int nums)

返回false

public boolean canjump(int nums) else

}return true;

}

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。

示例:

輸入: 1->2->3->4->5->null, k = 2

輸出: 4->5->1->2->3->null

解釋:向右旋轉 1 步: 5->1->2->3->4->null

向右旋轉 2 步: 4->5->1->2->3->null

迴圈鍊錶

方法**:

當出現單鏈表的旋轉問題,即位置平移的時候,可以考慮將單鏈表的首尾相連,然後從某個位置斷開即可。

那麼這就分成了兩部分:第一步,構建迴圈鍊錶,這裡需要遍歷一次鍊錶,將最末尾的指向最開頭。第二步,找到應該斷開的位置,將該位置前乙個指標指向null,然後返回該位置的指標,這裡可以採用雙指標的方式,在第一次迴圈的時候記錄下對應位置的節點。

函式頭:listnode rotateright(listnode head, int k)

將move和head連起來

儲存好tmp.next節點,再將tmp.next置空

返回這個存好的節點

public listnode rotateright(listnode head, int k) 

k = k % n;

if(k == 0) return head;

listnode fast = head;

listnode slow = head;

while(fast.next != null)

}listnode tmp = slow;

slow = slow.next;

tmp.next = null;

fast.next = head;

return slow;

}

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:

輸入:

[[1,3,1],

[1,5,1],

[4,2,1]

]輸出: 7

解釋: 因為路徑 1→3→1→1→1 的總和最小。

迴圈鍊錶

方法**:

動態規劃重要的是找到狀態轉移方程,那麼對於這個題,首先我們很清楚的是:因為只能往右和往下跑,所以,第一排和第一列的數永遠只有一種方式到達,然後從第二排第二列那個數開始,就有多種方式了,但是它的最短路徑還是受限於它的左邊那個數的最短路徑和上邊那個數的最短路徑。以此類推,按照這個順序乙個乙個填,很輕鬆就能填好一張最短路徑表。

函式頭:int minpathsum(int grid)

public int minpathsum(int grid) 

for(int i = 1; i < wid; ++i)

for(int i = 1; i < len; ++i)

}return dp[len-1][wid-1];

}

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。

最高位數字存放在陣列的首位, 陣列中每個元素只儲存單個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例:

輸入: [1,2,3]

輸出: [1,2,4]

解釋: 輸入陣列表示數字 123。

進製

方法**:

這個題看似簡單,當然實際上也很簡單,但是這麼簡單乙個題很容易做複雜,其實只需要思考兩種情況,一種個位不為9,那麼萬事大吉,但是**就得考慮個位為9的情況,那麼**怎麼寫最精簡這是最難的。一種常規思路是,先判斷個位,為9個位加一直接輸出,不為9再說,那麼這種情況就複雜了,如果十位也為9呢?這樣考慮**勢必越來越複雜。所以我們採用下面的思路:

見偽**

函式頭:int plusone(int digits)

digits = new int[len + 1];(這個地方要注意,到了這個位置dights所有位必全為0,直接new乙個新陣列就行了(預設是0))

digits[0] = 1;

返回dights

public int plusone(int digits) 

if(x > 0)

return newdig;

}return digits;

}

實現 int sqrt(int x) 函式。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。(不允許用sqrt函式)

示例:

輸入: 8

輸出: 2

說明: 8 的平方根是 2.82842...,

由於返回型別是整數,小數部分將被捨去。

數學

方法**:

由於不允許使用sqrt函式,我們可以尋求乙個替代的方法。可以看出x(1/2)=e((1/2)lnx)。

實話說,我想不到這個方法,但是還是記一下,以後被問到可以知道有這麼回事。用我們以前學過的迭代方法,可以將問題轉化為求y=x^2-c的零點,方法如下:

函式頭:int mysqrt(int x)

public int mysqrt(int x)

演算法 LeetCode刷題

given 1,3 2,6 8,10 15,18 return 1,6 8,10 15,18 關鍵就是a 1 b 0 也就是array i 1 1 array i 0 const merge array return array console.log merge 1,3 8,10 2,6 15,1...

leetcode演算法刷題 五 動態規劃 三

今天的題目不是leetcode上面的。只是覺得動態規劃還是不算很熟練,就接著找了點dp的題練練 題目的意思 傳入乙個陣列,要求出它的最長遞增子串行的長度。例如 如在序列1,1,2,3,4,5,6,7中,最長遞增序列為1,2,4,6,所以長度為4。分析 這道題我們可以用動態規劃來做。對於陣列的前i個元...

leetcode刷題 演算法思想

167 兩數之和 ii 輸入有序陣列 input numbers target 9output index1 1,index2 2我的弱智解法 全部遍歷一遍 class solution return array 優質解法 使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素...