Skip to content

26. 删除有序数组中的重复项【LeetCode 刷题日记】

记录自己从零开始刷 LeetCode,提高自己的数据结构与算法能力,为了获得更好的工作机会

数组 简单

题目:26. 删除有序数组中的重复项
地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/?envType=study-plan-v2&envId=top-interview-150

解题情况

  • 自行解出,暴力解法
  • 先 for 循环遍历,然后把不重复的元素放进一个新数组,再遍历新数组,依次覆盖前面数组的对应元素

我的解答

  • 解法:暴力解法,双重 for 循环
  • 时间复杂度:O(n^2),原数组 for 循环 n 次,新数组最大长度为 n, n * n
  • 空间复杂度:O(n),建立了一个新数组,最大长度为 n
javascript
var removeDuplicates = function (nums) {
  let _list = [];

  for (let i = 0; i < nums.length; i++) {
    if (_list && _list.findIndex((data) => nums[i] === data) === -1) {
      _list.push(nums[i]);
    }
  }

  for (let j = 0; j < _list.length; j++) {
    nums[j] = _list[j];
  }
  return _list.length;
};

参考优秀题解

  • 解法:双指针
  • 时间复杂度:O(n),最多遍历数组长度 n
  • 空间复杂度:O(1),未使用额外空间
  • 思考:关键点为有序,所以可以直接比较邻近 2 个元素;同理如何不是有序数组,则可以先利用 sort 进行排序,再比较邻近元素即可
javascript
var removeDuplicates = function (nums) {
  // 空数组情况
  if (nums.length === 0) {
    return 0;
  }

  // fast 遍历整个数组;slow 记录当前比对的最后索引
  let fast = 1,
    slow = 1;
  // 知道循环结束条件用 while 循环
  while (fast < nums.length) {
    if (nums[fast - 1] !== nums[fast]) {
      // 邻近元素不同,更新数组 slow 位置元素
      nums[slow] = nums[fast];
      slow++;
    }
    // 不管是否相同,fast 一直要走
    fast++;
  }
  return slow;
};

复盘

  • 我现在做了 5 道数组题目了,第一反应能想到的还是暴力解法,for 循环等
  • 不过这道题目是我自己独立做出来的,还是挺开心的,虽然算法效率不高
  • 其实昨天我好像也做了这个题目,当初没有做出来,今天一来就做出来了,这个也是很大的进步,加油
  • 几年前我最开始做 LeetCode 的时候,看到题目就感觉很烦,感觉题目读不懂,就不想做了,这次我要坚持下去,踏踏实实的做没道题,然后学习别人优秀的解法,提高自己的能力
  • 最近做的这几道数组题目,我发现双指针是比较常用的解法,我需要整理归纳题型解法,做到举一反三的思维
  • 我打算题目类型 5 道题为一个小阶段,然后再做其他类型的,保证每个类型都接触到,现在数组类型暂时做了 5 道了,接下来去做双指针类型题目

版权所有 © 2024 created by itchao