當時刷的是一道陣列去重的題
題幹https://leetcode.com/problems...
當時刷的時候也accepted了,但突然想到了一個問題,到底怎麼樣才能在不開新的數組的情況之下對原數組完成去重而且返回修改之後的數組? ?
下面是自己通過的程式碼
var removeDuplicates = function(nums) {
if(nums === null || nums.length === 0) return 0;
if(nums.length == 1) return 1;
var count = 0;
for(var i = 1 ; i < nums.length ; i++){
if(nums[count] != nums[i]){
count++;
nums[count] = nums[i];
}
}
return ++count;
};
開始的時候想到的是最後返回nums.length,但是仔細一想,這不是在開玩笑嘛,這樣寫返回的肯定還是原來未經改變的nums啊,所以就開始想到底怎麼返回這個被修改之後的數組,但是看了好多的數組去重的文章,還是沒找到答案,求大佬指導一波! ! ! !
阿神2017-06-12 09:30:19
就地去重的思路很簡單
建立一個以每個陣列元素為 key 的 hash 物件
每個元素透過 hash 判斷其是否已經存在與陣列中
如存在,將該元素刪除
遍歷完成後,移動數組元素,填補空位
由於移動數組元素是一個高耗操作(例如N 長數組被均勻挖掉N/2 個空,那麼這時由後往前移動元素的時間複雜度能到N^2 的水平),並且這個算法不符合當前的immutable 趨勢,因此這種做法是吃力不討好的,一般場景下也沒有必要去做。
怪我咯2017-06-12 09:30:19
這題不是單純的陣列去重,這個陣列是排好序的,這就跟亂序數組去重是不一樣的。
有序數組去重,相同元素會分佈在一起,所以只需要在遍歷過程中判斷後一個元素跟前一個元素是否相同,來進行去重。
這題當時我的 AC
var removeDuplicates = function(nums) {
var j = 0;
var i = 0;
for (; i < nums.length; i++) {
if (nums[j] !== nums[i]) {
nums[++j] = nums[i];
}
}
return j+1;
};