LeetCode演算法練習(一)有序陣列去重

2021-09-25 07:39:28 字數 2240 閱讀 2128

大學畢業以來一直想提公升自己資料結構與演算法相關的知識(大學沒有學好=。=),後來偶然的機會在網上看到leetcode,覺得很不錯,因此就打算通過leetcode來練習演算法相關的一些知識和能力,活躍自己思維,鍛鍊自己的程式設計能力。

目前打算總結的有如下幾點:

那麼開始我的第一次演算法練習總結。

給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2], 

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為

1,2
你不需要考慮陣列中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為

0, 1, 2, 3, 4
你不需要考慮陣列中超出新長度後面的元素。
要想正確的解題我們首先要準確的理解題意(我一開始就理解錯了)。

首先,這裡的多次強調要在原地刪除或者原地修改,因此我們只能對nums陣列進行操作,不能再宣告額外的陣列或者物件。

其次,這裡因為這個刪除的字眼導致了當時的理解錯誤,我以為是真的必須要刪除掉重複出現的元素生成乙個不包含重複元素的陣列,實際上我們看了下面的例子就能明白,這裡並不是必須要刪除掉nums中重複的元素,我們需要的是將不重複的數陣列元素排在陣列的前面,並返回不重複陣列元素的長度(實際上使用我們重新生成的陣列和不重複元素的長度我們也就可以輕易的得到乙個不重複陣列了)。

還有一點是這裡說明了是乙個有序陣列,我當時是按照無序陣列做的,最後看別人的答案時還以為別人的不對呢=。=。

那麼接下來就說一下我的解題思路:

我首先想到的就是最笨的方法,兩次遍歷陣列,即將陣列中的每個元素與它之後的每個元素比較,如果有與它相同的元素,那麼使用js陣列的splice方法將重複的元素刪除,**如下。

/**

* @param nums

* @return

*/var removeduplicates = function(nums)

}}

這個就是我當初提交的答案了。但是執行時間為300ms-400ms左右 。執行時間很長,因此就去看了一下別人的提交的答案,然後驚奇的發現很多同學並沒有真正的刪除掉重複元素,而是將不重複元素一次排列在陣列的前面。有的在我看來還是錯的,因為執行後還是有排列在前的還是有重複元素。

後來發現是自己沒有準確的理解題意,首先是忽略了有序陣列的前提,其次是沒有理解原地修改元素的說法。

我們主要來看乙個在我看來較為優秀的解法,先上**:

var removeduplicates = function (nums) 

}return count+1;

};

實際上我們如果精確的理解了題意之後理解上面的**很簡單,首先我們知道我們要處理的陣列是乙個有序的陣列,所以才可以使用上面的程式解決。那麼我們來講一下上面這段程式的解題思路(我看有人稱這種方法雙指標法)。

首先這是乙個有序陣列,我們只需要宣告乙個變數來做為新陣列的指標,那麼這個指標肯定是從0開始的,我們只需要在遍歷一遍原陣列,在遇到乙個與當前最靠後的新陣列指標(即當前count的值)指向的陣列元素不相等的值時我們就將指標count加1,並將該原陣列的元素賦值給新陣列的指標count+1的元素。這樣,我們只需要遍歷一遍陣列,既可以得到所需新陣列的長度。

我們可以看出,這個程式實際上並沒有刪除掉所有的重複元素,但是我們知道,我們知道了不重複陣列的元素那麼借助陣列的splice方法我們可以很簡單的得到所需的新陣列。

首先,以後解題時首先要準確的理解了題意再開始解題=。=,

其次,注意刪除陣列時陣列指標的移動。

最後,我認為此題目就是在指引我們思考在解決有序陣列去重方面建立一種新的高效的解決思路,我們不是在發現重複元素即刪除的方法,而是在對陣列元素重新賦值,獲得新陣列之後整體切割。

如有其它高見,還望不吝賜教=。=、

leetcode 66 加一 有趣

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,3,...

leetcode演算法練習 合併2個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的 示例 輸入 1 2 4,1 3 4輸出 1 1 2 3 4 4分析 兩個鍊錶都是有序的。建立乙個新鍊錶,依次比較兩個待合併鍊錶的節點並使新列表的下乙個節點指向較小的節點,然後令較小節點所屬鍊錶的指標指向下乙個...

leetcode演算法練習 88 合併兩個有序陣列

所有題目源 git位址 題目給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存...