一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
一起来学点算法,这里是慢慢学算法,我是小coder。
题目描述
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
题目分析
给定nums是有序数组,所以重复元素是挨着的,所以我们关键就是在于去重:
- 删除重复元素:意味着改变数组长度,但题目要求原地修改,不选。
- 过滤重复元素:留下不重复的,按顺序排列,满足题目要求,可选。
解题思路
- 确定操作数组:本题中,操作数组就一个nums
- 确定操作条件:操作条件为去重,在一个有序的数组中,重复的元素是挨着的,如果前一个和当前不重复,我们就要这个,注意索引边界。
- 确定操作过程:操作过程为:统计要的个数。
- 确定结果返回:将统计个数返回
代码
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,去最大等等。
实现思路要满足要求。过滤条件要考虑索引是否越界等等。