LeedCode算法第三天:
本次的算法便是將一個有序數組中的重複元素去掉,並將去掉重複元素的數組的長度返回。
本人一開始考慮的是將整個數組進行循環,並進行一一比較,重複兩個的話則長度減一,但這樣的做法並不健全。
重新考慮後,得到以下算法。
算法①:
此算法使用兩個快慢指針,首先二者均指向第一個元素。然後進行移動。移動原則如下:兩個指針若指向的數值相同,則快指針向後移動,慢指針不動,若不同,
二者都移動。當快指針移動到最後一位時,慢指針的下標加一,便是新數組的長度。
public class Solution
{
public int removeDuplicates(int[] nums)
{
int len=nums.length;
int p=0;
int q=0;
if(len<=1)
{
return len;
}
while(q<len)
{
if(nums[p]==nums[q])
{
q++;
}
else
{
p++;
nums[p]=nums[q];//快指針的值對重複的值進行覆蓋
q++;
}
}
return p+1;
}
}
但是看了一下大神的博客,才知道人家的很強,自己的屬實low逼。
其實在原理上,均是使用的快慢指針的思想,但是以下算法更加精簡。如果不相等,那麼直接後移。
如果相等則只移動快指針。(因爲是有序的,第一個比完以後便不必考慮,其他的也如此)。
public class Solution {
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int last = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[last]) {
nums[++last] = nums[i];
}
}
return last + 1;
}
}