26. 删除有序数组中的重复项
双指针法
class Solution {
public int removeDuplicates(int[] nums) {
/**
* 定义两个指针n和i,n指向左边没有重复元素子数组的最后一位,i指向当前遍历元素
* 只有当后一个元素大于前一个元素时,才将其放入以n结尾的数组中
* 最终返回的就是长度为n + 1的数组
* 数组为空时需要单独考虑
*/
if (nums == null || nums.length == 0){
return 0;
}
int n = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[n] < nums[i]){
n++;
nums[n] = nums[i];
}
}
return n + 1;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——避免重复的赋值
class Solution {
public int removeDuplicates(int[] nums) {
/**
* 定义两个指针n和i,n指向左边没有重复元素子数组的最后一位,i指向当前遍历元素
* 只有当后一个元素大于前一个元素时,才将其放入以n结尾的数组中
* 最终返回的就是长度为n + 1的数组
* 数组为空时需要单独考虑
*/
if (nums == null || nums.length == 0){
return 0;
}
int n = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[n] < nums[i]){
n++;
/**
* 如果指向的是同一个元素就不用赋值
*/
if (n != i) {
nums[n] = nums[i];
}
}
}
return n + 1;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/