面向小白的力扣26题题解

159 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

一起来学点算法,这里是慢慢学算法,我是小coder。

题目描述

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k

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

题目分析

给定nums是有序数组,所以重复元素是挨着的,所以我们关键就是在于去重:

  1. 删除重复元素:意味着改变数组长度,但题目要求原地修改,不选。
  2. 过滤重复元素:留下不重复的,按顺序排列,满足题目要求,可选。

解题思路

  1. 确定操作数组:本题中,操作数组就一个nums
  2. 确定操作条件:操作条件为去重,在一个有序的数组中,重复的元素是挨着的,如果前一个和当前不重复,我们就要这个,注意索引边界。
  3. 确定操作过程:操作过程为:统计要的个数。
  4. 确定结果返回:将统计个数返回

代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int m=0;
      for(int i=0 ; i<nums.size();i++){
          if(i==0 ||nums[i-1] !=nums[i]){
              nums[m]=nums[i];
              m++;
          }
      }
      return m;
    }
};

题目总结

此题过滤条件为:重复元素 如果此题不是过滤重复元素,则需修改过滤条件,比如去0,去最大等等。

实现思路要满足要求。过滤条件要考虑索引是否越界等等。