【LeetCode每日一题】——26.删除排序数组中的重复项

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目说明】
  • 六【题目示例】
  • 七【题目注意】
  • 八【解题思路】
  • 九【时间频度】
  • 十【代码实现】
  • 十一【提交结果】

一【题目类别】

  • 数组

二【题目难度】

  • 简单

三【题目编号】

  • 26.删除排序数组中的重复项

四【题目描述】

  • 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
  • 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

五【题目说明】

  • 说明:
  • 为什么返回数值是整数,但输出的答案是数组呢?
  • 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
  • 你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

六【题目示例】

  • 示例 1:
    输入:nums = [1,1,2]
    输出:2, nums = [1,2]
    解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
  • 示例 2:
    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    输出:5, nums = [0,1,2,3,4]
    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

七【题目注意】

  • 0 < = n u m s . l e n g t h < = 3 ∗ 1 0 4 0 <= nums.length <= 3 * 10^4 0<=nums.length<=3104
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104
  • n u m s 已 按 升 序 排 列 nums 已按升序排列 nums

八【解题思路】

  • 注意数组有序且连续,那么定义双指针,slow始终指向不重复的数组元素的最后一个位置,fast用来遍历数组和比较是否重复。只有遇到不重复的时候把fast的元素移动到slow的位置,遍历完之后slow的位置就是最后一个不重复且有序的数组,这时+1就是新的不重复数组的长度

九【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N)

十【代码实现】

  1. Java语言版
package Array;

public class p26_RemoveDuplicatesFromSortedArray {

    public static void main(String[] args) {
        int[] nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        int res = removeDuplicates(nums);
        System.out.println("res = " + res);
    }

    public static int removeDuplicates(int[] nums) {
        if (nums.length == 0 || nums == null) {
            return nums.length;
        }
        // 定义快慢指针
        int slowIndex = 0; // 慢指针主要作用是对比元素是否相等和预留不相等的元素位置
        int quickIndex = 1; // 快指针的主要作用是对比元素是否相等和遍历整个数组
        // 循环整个数组
        while (quickIndex < nums.length) {
            // 当两个值相等的时候,我们并不交换,而是使快指针向前走,跳过当前元素,这样的目的是找出所有的重复元素
            if (nums[slowIndex] == nums[quickIndex]) {
                quickIndex++;
            }
            // 如果两个值不相等,那么慢指针就+1,只+1,预留一个位置给不相等的元素,因为数组有序,直接将第一个不相等的元素放到慢指针指定位置,然后快指针继续循环
            else {
                slowIndex++;
                nums[slowIndex] = nums[quickIndex];
                quickIndex++;
            }
        }
        // 打印最终的数组
        for (int i = 0; i < slowIndex + 1; i++) {
            System.out.println(nums[i]);
        }
        // 返回结果
        return slowIndex + 1;
    }

}
  1. C语言版
#include
#include

int removeDuplicates(int* nums, int numsSize) 
{
	/*如果空数组直接返回*/
	if (numsSize == 0 || nums == NULL)
	{
		return numsSize;
	}
	/*定义快慢指针*/
	int slowIndex = 0; /*慢指针主要作用是对比元素是否相等和预留不相等的元素位置*/
	int quickIndex = 1; /*快指针的主要作用是对比元素是否相等和遍历整个数组*/
	/*循环整个数组*/
	while (quickIndex < numsSize)
	{
		/*当两个值相等的时候,我们并不交换,而是使快指针向前走,跳过当前元素,这样的目的是找出所有的重复元素*/
		if (nums[slowIndex] == nums[quickIndex])
		{
			quickIndex++;
		}
		/*如果两个值不相等,那么慢指针就+1,只+1,预留一个位置给不相等的元素,因为数组有序,直接将第一个不相等的元素放到慢指针指定位置,然后快指针继续循环*/
		else
		{
			slowIndex++;
			nums[slowIndex] == nums[quickIndex];
			quickIndex++;
		}
	}
	/*返回结果*/
	return slowIndex + 1;
}

int main(void)
{
	/*主函数省略*/
}

十一【提交结果】

  1. Java语言版
    【LeetCode每日一题】——26.删除排序数组中的重复项_第1张图片
  2. C语言版
    【LeetCode每日一题】——26.删除排序数组中的重复项_第2张图片

你可能感兴趣的:(LeetCode,leetcode,数据结构,算法,数组,快慢指针)