leetcode-pp / 91alg-13-daily-check

0 stars 0 forks source link

【Day 26 】2024-05-03 - 26.删除排序数组中的重复项 #27

Open azl397985856 opened 2 months ago

azl397985856 commented 2 months ago

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

入选理由

暂无

题目地址

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

前置知识

暂无

题目描述

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,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。

你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

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

class Solution { public: int removeDuplicates(vector& nums) { int n = nums.size(); if(n == 0){ return 0; } int fast = 1, slow = 1; while(fast <= n-1){ if(nums[fast] != nums[fast-1]){ nums[slow++] = nums[fast]; } fast++; } return slow; } };

rao-qianlin commented 2 months ago

思路:使用双指针

代码:

class Solution {
    public int removeDuplicates(int[] nums) {
        int i = 0;
        int j = 0;

        while(j < nums.length){
            if(nums[i] == nums[j]){
                j ++;
            }
            else{
                i ++;
                nums[i] = nums[j];
                j ++;
            }
        }
        return i+1;

    }
}
zhiyuanpeng commented 2 months ago
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        diffs = set()
        l, r, ans = 0, 0, 1
        diffs.add(nums[0])
        for r in range(1, len(nums)):
            if nums[r] in diffs:
                continue
            else:
                l += 1
                nums[l] = nums[r]
                ans += 1
                diffs.add(nums[r])
        return ans
xil324 commented 2 months ago
def removeDuplicates(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    if not nums:
        return 0
    if len(nums) == 1:
        return 1
    left = 0
    for right in range(1,len(nums)):
        if nums[left] != nums[right]:
            left+=1
            nums[left] = nums[right]
    return left + 1
CathyShang commented 2 months ago
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        int slow=1, fast=1;
        while(fast<n){
            if(nums[fast] != nums[fast-1]){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;        
    }
};
atom-set commented 1 month ago

思路

代码

var removeDuplicates = function (nums) {
  var len = nums.length;

  if (len <= 1) {
    return len;
  }

  var point = 0;
  var map = new Map();

  map.set(nums[0], 1);

  for (var i = 1; i <= len - 1; i++) {
    if (!map.has(nums[i])) {
      map.set(nums[i], 1);
      point = point + 1;
      nums[point] = nums[i];
    }
  }
  return point + 1;
};

复杂度分析

N 数据规模,

hillsonziqiu commented 1 month ago

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
    var p = 0;
    var n = nums.length;
    for (let i = 1; i < n; i++) {
        if (nums[i] != nums[i - 1]) {
            p++;
            nums[p] = nums[i];
        }
    }
    return p + 1;
};

复杂度分析

时间复杂度:O(n) 空间复杂度:O(1)