乘風破浪:LeetCode真題_026_Remove Duplicates from Sorted Array
阿新 • • 發佈:2019-01-04
乘風破浪:LeetCode真題_026_Remove Duplicates from Sorted Array
一、前言
我們這次的實驗是去除重複的有序陣列元素,有大體兩種演算法。
二、Remove Duplicates from Sorted Array
2.1 問題
題目大意理解,就是對陣列進行元素去重,然後返回去處重複之後的長度,無論我們對陣列做了什麼的修改,都沒有關係的,只要保證再返回的長度之內的陣列正確性即可。因為最後是根據長度來遍歷的,因此我們不用擔心。
2.2 分析與解決
題目說的很清晰了,因此,我們首先想到了笨辦法,那就是從左往右遍歷,如果發現相等的元素,就將後面的元素集體前移,這樣最差的時間複雜度是O(n~2)。因此我們想想有沒有簡單的方法,於是我們想到了只用找一個指標在前面開路,遇到不同的元素了,將這個元素填到相應的位置,然後繼續搜尋,直至遍歷完所有的元素即可,這樣一次遍歷就能解決問題,時間複雜度O(n~2),只不過也留下了髒空間,不過題目說了不用我們管了,於是問題解決。
第一種是笨辦法:
public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i + 1; }
第二種是一次遍歷:
public class Solution { /** * * 題目大意 * 給定一個排序的陣列,將陣列中的重複元素去掉,相同的只保留一個作為新陣列的元素, * 並且返回陣列新的元素個數, * 不要建立一個新的陣列來儲存結果。在常量時間內解決這個問題 * * 解題思路 * 從第二個元素開始處理,記為當前處理的元素,如果當前元素與他的前一個元素相同就刪除這個元素, * 如果不同就將它移動到正確的位置,返回最後陣列元素個數。 */ public int removeDuplicates(int[] A) { if (A.length == 0) { return 0; } int index = 0;//[0,index]只記錄陣列中出現的按從小到大的唯一一個數,已經排好序了 int next = 1; // 演算法思想:找index之後的比A[index]大的數,如是找到就移動到A[index+1]處, // index移動到下一個位置,next移動到下一個位置,再找比A[index]大的數 while (next < A.length) { while (next < A.length && A[index] == A[next]) { // 找不等於陣列中最 next++; } if (next < A.length) { index++; A[index] = A[next]; next++; } } return index + 1; } }
三、總結
將O(n~2)的複雜度下降一個等級,其實就是簡單的利用了一些技巧和思維,但是節省而來的大量的運算時間。