26.删除排序数组中的重复项
自己的写法,不想评价
用到了双指针和冒泡的思想,时间复杂度有点慢O(n^2),空间复杂度很行。
class Solution {
public int removeDuplicates (int[] nums) {
for (int i=0; i<nums.length-1; i++) {
if (nums[i+1] <= nums[i]) {
int j = i + 1;
int k = i + 2;
try {
while (nums[k] <= nums[i]) {
k++;
}
int tmp = nums[j];
nums[j] = nums[k];
nums[k] = tmp;
} catch (Exception e) {
e.printStackTrace();
}
}
}
for (int i=0; i<nums.length-1; i++) {
if (nums[i+1] <= nums[i]) {
return i+1;
}
}
return nums.length;
}
}
官方的写法
主要用到了双指针的思想
数组完成排序后,我们可以放置两个指针i和j,其中i是慢指针,而j是快指针。只要 nums[i] = nums[j],我们就增加j以跳过重复项。
当我们遇到 nums[j]≠nums[i]时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到nums[i+1]。然后递增 i,接着我们将再次重复相同的过程,直到j到达数组的末尾为止。
class Solution {
public int removeDuplicates(int[] nums) {
int i = 0;
if (nums == null || nums.length == 0) {
return 0;
}
for (int j=0; j<nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i+1;
}
}

浙公网安备 33010602011771号