天天AC系列(十一):刪除排序數組中的重複項

1 題目

LeetCode第26題,給出一個非降序的數組,刪除重複的元素.
在這裏插入圖片描述java

2 覆蓋移動

題目明確要求不能使用額外的數組空間,一開始,沒想到什麼好的算法.
可是,它又有提示,不須要考慮數組中超出新長度後面的元素,全部,就想到了覆蓋移動這樣的方法.
思想很簡單,就是使用兩個下標,一個下標表示要返回的下一個要被替換的數,同時這個下標加1表明要返回的長度,一個下標爲遍歷數組的下標.
首先,遍歷數組,若遇到大於nums[index]的數,首先判斷當前下標是否爲index的下一個,若是是下一個的話覆蓋至關於重複了,把本身賦給本身,若i與index的距離大於1,則在自增index的同時,把i處的值覆蓋到index處,這樣就不用移動後面的數了,並且能夠保證這樣的數有序,最後返回index+1,表示不重複的元素的個數,即新數組的長度.git

int index = 0;
for(int i=1;i<nums.length;++i)
{
    if(nums[i] > nums[index])
    {
        if(i > ++index)
            nums[index] = nums[i];
    }
}
return index+1;

在這裏插入圖片描述
嗯,一次就AC,舒服.
其餘解法?不清楚,看了別人的題解差很少都是這樣的,不過叫法不同,叫雙指針,快慢指針,本質都是同樣.github

4 再來一題

實在沒想到上一題這麼不堪一擊,而後下一題是LeetCode的27題,與上一題有點相似,給定一個數組,刪除數值等於指定值的全部元素.
在這裏插入圖片描述算法

5 解法

int index = -1;
for (int i = 0; i < nums.length; ++i) 
{
    if(nums[i] != val)
    {
        if (i > ++index)
            nums[index] = nums[i];
    }
}
return index + 1;

仍是同樣的解法啊,覆蓋移動,快慢指針,這是上次的代碼改了if的判斷條件,而後就:
在這裏插入圖片描述
不想說什麼了.數組

6 源碼

githubide

碼雲指針

相關文章
相關標籤/搜索