返回

刷题打卡:LeetCode 26. 删除有序数组中的重复项

前端

各位题友大家好,我是技术博客作者 [昵称],很高兴与大家分享我刷 LeetCode 的解题思路和心得。今天我们来解决第 26 题:删除有序数组中的重复项。

题目

给定一个有序数组 nums,请原地删除重复的元素,使得每个元素只出现一次。返回数组的新长度。

例如:

输入:nums = [1,1,2]
输出:2, nums = [1,2]

解题思路:

这道题本质上要求我们遍历数组并删除重复的元素。我们可以使用双指针法来解决这个问题。

算法步骤:

  1. 定义两个指针 ij,其中 i 为慢指针,j 为快指针。
  2. j = 0 开始,遍历数组。
  3. 如果 nums[i] != nums[j],则说明当前元素与前一个元素不同,我们将其赋值给 nums[i+1],并将 i 加 1。
  4. 否则,如果 nums[i] == nums[j],则说明当前元素与前一个元素相同,我们只需将 j 加 1,继续遍历即可。
  5. 重复步骤 3-4,直到 j 遍历完数组。
  6. 返回 i+1,表示数组的新长度。

代码示例:

C++:

int removeDuplicates(vector<int>& nums) {
  if (nums.empty()) return 0;

  int i = 0;
  for (int j = 1; j < nums.size(); j++) {
    if (nums[i] != nums[j]) {
      nums[++i] = nums[j];
    }
  }

  return i + 1;
}

Java:

public class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 0) return 0;

        int i = 0;
        for (int j = 1; j < nums.length; j++) {
            if (nums[i] != nums[j]) {
                nums[++i] = nums[j];
            }
        }

        return i + 1;
    }
}

Python:

def removeDuplicates(nums):
  if not nums: return 0

  i = 0
  for j in range(1, len(nums)):
    if nums[i] != nums[j]:
      nums[i+1] = nums[j]
      i += 1

  return i + 1

Rust:

fn remove_duplicates(nums: &mut [i32]) -> usize {
    if nums.is_empty() {
        return 0;
    }

    let mut i = 0;
    for j in 1..nums.len() {
        if nums[i] != nums[j] {
            nums[i + 1] = nums[j];
            i += 1;
        }
    }

    i + 1
}

Go:

func removeDuplicates(nums []int) int {
    if len(nums) == 0 {
        return 0
    }

    i := 0
    for j := 1; j < len(nums); j++ {
        if nums[i] != nums[j] {
            nums[i+1] = nums[j]
            i++
        }
    }

    return i + 1
}

总结:

使用双指针法可以高效地删除有序数组中的重复元素。只要注意指针的移动顺序和条件即可。希望这篇文章对各位刷题打卡有所帮助,让我们一起努力,提高编程技能!