leetcode官方《初級算法》題集(一)數(shù)組

一、給定兩個數(shù)組,編寫一個函數(shù)來計算它們的交集。

1:哈希表

由于同一個數(shù)字在兩個數(shù)組中都可能出現(xiàn)多次,因此需要用哈希表存儲每個數(shù)字出現(xiàn)的次數(shù)。對于一個數(shù)字,其在交集中出現(xiàn)的次數(shù)等于該數(shù)字在兩個數(shù)組中出現(xiàn)次數(shù)的最小值。

首先遍歷第一個數(shù)組,并在哈希表中記錄第一個數(shù)組中的每個數(shù)字以及對應(yīng)出現(xiàn)的次數(shù),然后遍歷第二個數(shù)組,對于第二個數(shù)組中的每個數(shù)字,如果在哈希表中存在這個數(shù)字,則將該數(shù)字添加到答案,并減少哈希表中該數(shù)字出現(xiàn)的次數(shù)。

為了降低空間復(fù)雜度,首先遍歷較短的數(shù)組并在哈希表中記錄每個數(shù)字以及對應(yīng)出現(xiàn)的次數(shù),然后遍歷較長的數(shù)組得到交集。

2:排序 + 雙指針

如果兩個數(shù)組是有序的,則可以使用雙指針的方法得到兩個數(shù)組的交集。

首先對兩個數(shù)組進行排序,然后使用兩個指針遍歷兩個數(shù)組。

初始時,兩個指針分別指向兩個數(shù)組的頭部。每次比較兩個指針指向的兩個數(shù)組中的數(shù)字,如果兩個數(shù)字不相等,則將指向較小數(shù)字的指針右移一位,如果兩個數(shù)字相等,將該數(shù)字添加到答案,并將兩個指針都右移一位。當至少有一個指針超出數(shù)組范圍時,遍歷結(jié)束。

二、給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標值 target,請你在該數(shù)組中找出 和為目標值 的那 兩個 整數(shù),并返回它們的數(shù)組下標。

你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素在答案里不能重復(fù)出現(xiàn)。

你可以按任意順序返回答案。

1:暴力枚舉

最容易想到的方法是枚舉數(shù)組中的每一個數(shù) x,尋找數(shù)組中是否存在 target - x。

當我們使用遍歷整個數(shù)組的方式尋找 target - x 時,需要注意到每一個位于 x 之前的元素都已經(jīng)和 x 匹配過,因此不需要再進行匹配。而每一個元素不能被使用兩次,所以我們只需要在 x 后面的元素中尋找 target - x。

2:哈希表

注意到方法一的時間復(fù)雜度較高的原因是尋找 target - x 的時間復(fù)雜度過高。因此,我們需要一種更優(yōu)秀的方法,能夠快速尋找數(shù)組中是否存在目標元素。如果存在,我們需要找出它的索引。

使用哈希表,可以將尋找 target - x 的時間復(fù)雜度降低到從 O(N)O(N) 降低到 O(1)O(1)。

這樣我們創(chuàng)建一個哈希表,對于每一個 x,我們首先查詢哈希表中是否存在 target - x,然后將 x 插入到哈希表中,即可保證不會讓 x 和自己匹配。

3:指針+鏈表(自己想的非官方解法)

將數(shù)組排序生成2個鏈表,兩個指針一個從頭部開始遍歷,一個從尾部開始遍歷,相等輸出,不相等移動其中一個指針。(提前指定以哪個為基)

三、給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次。找出那個只出現(xiàn)了一次的元素。

1:使用集合存儲數(shù)字。

遍歷數(shù)組中的每個數(shù)字,如果集合中沒有該數(shù)字,則將該數(shù)字加入集合,如果集合中已經(jīng)有該數(shù)字,則將該數(shù)字從集合中刪除,最后剩下的數(shù)字就是只出現(xiàn)一次的數(shù)字。

2:使用哈希表存儲每個數(shù)字和該數(shù)字出現(xiàn)的次數(shù)。

遍歷數(shù)組即可得到每個數(shù)字出現(xiàn)的次數(shù),并更新哈希表,最后遍歷哈希表,得到只出現(xiàn)一次的數(shù)字。

3:使用集合存儲數(shù)組中出現(xiàn)的所有數(shù)字,并計算數(shù)組中的元素之和。

由于集合保證元素無重復(fù),因此計算集合中的所有元素之和的兩倍,即為每個元素出現(xiàn)兩次的情況下的元素之和。由于數(shù)組中只有一個元素出現(xiàn)一次,其余元素都出現(xiàn)兩次,因此用集合中的元素之和的兩倍減去數(shù)組中的元素之和,剩下的數(shù)就是數(shù)組中只出現(xiàn)一次的數(shù)字。

4:位運算(異或)

數(shù)組中的全部元素的異或運算結(jié)果即為數(shù)組中只出現(xiàn)一次的數(shù)字

四、給定一個數(shù)組,將數(shù)組中的元素向右移動 k 個位置,其中 k 是非負數(shù)。

1:使用額外的數(shù)組

我們可以使用額外的數(shù)組來將每個元素放至正確的位置。用 nn 表示數(shù)組的長度,我們遍歷原數(shù)組,將原數(shù)組下標為 ii 的元素放至新數(shù)組下標為 (i+k)\bmod n(i+k)modn 的位置,最后將新數(shù)組拷貝至原數(shù)組即可。

其他方法待補充

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

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

  • 目錄 1 左神部分集錦 2 Leetcode前150題 3 ??途W(wǎng)劍指offer 4 JavaG 5 題目中的...
    小小千千閱讀 1,371評論 0 0
  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,363評論 0 3
  • 刪除排序數(shù)組中的重復(fù)項[https://leetcode-cn.com/leetbook/read/top-int...
    renyjenny閱讀 289評論 0 0
  • 1 鏈表反轉(zhuǎn) 2 鏈表兩兩反轉(zhuǎn) 3 判斷鏈表是否有環(huán) 3.1 頭結(jié)點開始遍歷,直到位NULL(卡時間,避免死循環(huán)...
    289d3a591637閱讀 403評論 0 0
  • 目錄 1 左神部分集錦 2 Leetcode前150題 3 牛客網(wǎng)劍指offer 4 JavaG 5 題...
    小小千千閱讀 1,204評論 0 0

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