LeetCode第26題,給出一個非降序的數組,刪除重複的元素.
java
題目明確要求不能使用額外的數組空間,一開始,沒想到什麼好的算法.
可是,它又有提示,不須要考慮數組中超出新長度後面的元素,全部,就想到了覆蓋移動這樣的方法.
思想很簡單,就是使用兩個下標,一個下標表示要返回的下一個要被替換的數,同時這個下標加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
實在沒想到上一題這麼不堪一擊,而後下一題是LeetCode的27題,與上一題有點相似,給定一個數組,刪除數值等於指定值的全部元素.
算法
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的判斷條件,而後就:
不想說什麼了.數組
githubide
碼雲指針