算法時(shí)間 I

1. 移動(dòng)零

給定一個(gè)數(shù)組 nums,編寫一個(gè)函數(shù)將所有 0 移動(dòng)到數(shù)組的末尾,同事保持非零元素的相對(duì)順序。
示例:

輸入:[0, 1, 0, 3, 12]
輸出:[1, 3, 12, 0, 0]

說明:

  1. 必須在原數(shù)組上操作,不能拷貝額外的數(shù)組
  2. 盡量減少操作次數(shù)

解題思路:

  1. 設(shè)置變量 j = 0,順序遍歷數(shù)組,當(dāng)遍歷到元素 ≠ 0 時(shí),將 nums[j] = nums[i],nums[i] = 0, 并且 j++。

leetcode 提交記錄

2. 盛最多水的容器

給定一個(gè)長(zhǎng)度為 n 的整數(shù)數(shù)組 height 。有 n 條垂線,第 i 條線的兩個(gè)端點(diǎn)是 (i, 0) 和 (i, height[i]) 。

找出其中的兩條線,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。

返回容器可以儲(chǔ)存的最大水量。

說明:你不能傾斜容器。
鏈接

解題思路:

  1. 設(shè)定左右兩邊下標(biāo)分別為 i = 0, j = height.length
  2. 在 i < j 的前提下,比較矮的下標(biāo) 向左(j--)或向右(i++)移動(dòng)一位,并計(jì)算面積,得出最大值

解題原理:
由于面積是寬度與高度的乘積,在兩邊向內(nèi)收縮的循環(huán)中,只有高度增加的時(shí)候面積才有可能增大,所以我們尋找高度比較矮的邊間尋找可以使之增大的下標(biāo),以求能夠找到更大面積的可能性。

leetcode 提交

3. 爬樓梯

假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。
每次你可以爬 1 或 2 個(gè)臺(tái)階。你有多少種不同的方法可以爬到樓頂呢?
原題

解題思路:

  1. 一級(jí)臺(tái)階 1,二級(jí)臺(tái)階 2, 三級(jí)臺(tái)階可以從1級(jí)臺(tái)階直接上或者從2級(jí)臺(tái)階走一步上。
  2. 4 級(jí)臺(tái)階 從3 級(jí)走一步或者從 2級(jí)走兩步,所以4級(jí)臺(tái)階是上2級(jí)和3三級(jí)臺(tái)階方法的總和
  3. 所以 n 級(jí)臺(tái)階 即 (n - 1) + (n - 2)
  4. 使用循環(huán)累加的方式,算出 n 的值

leetcode

4. 三數(shù)之和

給你一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?請(qǐng)你找出所有和為 0 且不重復(fù)的三元組。

注意:答案中不可以包含重復(fù)的三元組。
原題

解題思路:

  1. a + b + c = 0 等價(jià)于 b + c = -a
  2. 建立循環(huán),k = 0,錨定 target = nums[k]
  3. 建立左右指針 i = k + 1, j = nums.length - 1,當(dāng) nums[i] + nums[j] = - target 時(shí),則找到目標(biāo)
  4. 要使用雙指針夾逼,則需要先對(duì)數(shù)組進(jìn)行排序。
  5. 當(dāng)雙指針之和大于target 時(shí),則右指針左移,減小合值。
  6. 當(dāng)雙指針之和小于target 時(shí),則左指針右移,增大合值。
  7. 當(dāng)找到符合的值后,左右指針各向中間移動(dòng)若干位,需保證移動(dòng)后,下一位與移動(dòng)前的值是不同的,防止重復(fù)。
  8. i >= j 的時(shí)候,進(jìn)行一下次循環(huán),k ++

leetcode 提交

5. 反轉(zhuǎn)鏈表

給你單鏈表的頭節(jié)點(diǎn) head ,請(qǐng)你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表。
原題

思路:

  1. 取出上一個(gè) pre = null, 當(dāng)前 current = head,下一個(gè) next = current.next,
  2. 循環(huán),當(dāng)current == null 退出循環(huán)
  3. current.next = pre
  4. pre = current
  5. current = next
  6. 最后返回pre

leetcode 提交

6. 環(huán)形鏈表

給你一個(gè)鏈表的頭節(jié)點(diǎn) head ,判斷鏈表中是否有環(huán)。
如果鏈表中有某個(gè)節(jié)點(diǎn),可以通過連續(xù)跟蹤 next 指針再次到達(dá),則鏈表中存在環(huán)。 為了表示給定鏈表中的環(huán),評(píng)測(cè)系統(tǒng)內(nèi)部使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。注意:pos 不作為參數(shù)進(jìn)行傳遞 。僅僅是為了標(biāo)識(shí)鏈表的實(shí)際情況。
如果鏈表中存在環(huán) ,則返回 true 。 否則,返回 false 。
原題

解題思路

  1. 使用雙指針,i 每次走一格,j 每次走兩格
  2. 當(dāng)指針重疊,說明有環(huán)

leetcode 提交

7. 刪除有序數(shù)組中的重復(fù)項(xiàng)

給你一個(gè) 升序排列 的數(shù)組 nums ,請(qǐng)你 原地 刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長(zhǎng)度。元素的 相對(duì)順序 應(yīng)該保持 一致 。
由于在某些語(yǔ)言中不能改變數(shù)組的長(zhǎng)度,所以必須將結(jié)果放在數(shù)組nums的第一部分。更規(guī)范地說,如果在刪除重復(fù)項(xiàng)之后有 k 個(gè)元素,那么 nums 的前 k 個(gè)元素應(yīng)該保存最終結(jié)果。
將最終結(jié)果插入 nums 的前 k 個(gè)位置后返回 k 。
不要使用額外的空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
原題

解題思路:

  1. 設(shè)定初始 k = 0
  2. 向后遍歷并比較,如果 nums[k] != nums[i];則 nums[++k] = nums[i]
  3. 最終返回 k + 1,表示數(shù)組長(zhǎng)度

leetcode 提交

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容