有哪些网站可以做推广,wordpress影视模版,搜狐新闻手机网,中国艺术设计联盟题目描述
给你一个有序数组 nums #xff0c;请你 原地 删除重复出现的元素#xff0c;使得出现次数超过两次的元素只出现两次 #xff0c;返回删除后数组的新长度。 不要使用额外的数组空间#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 …题目描述
给你一个有序数组 nums 请你 原地 删除重复出现的元素使得出现次数超过两次的元素只出现两次 返回删除后数组的新长度。 不要使用额外的数组空间你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1
输入nums [1,1,1,2,2,3]
输出5, nums [1,1,2,2,3]
解释函数应返回新长度 length 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。示例 2
输入nums [0,0,1,1,1,1,2,3,3]
输出7, nums [0,0,1,1,2,3,3]
解释函数应返回新长度 length 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。整体思路 这是一个有序的数组出现重复的数子只会在一起。因为我们找到一个重复数字之后就需要立即删除导致数组后边的元素会一直发生元素的序号变化所以我们采用从后往前的方法。使用两个指针一个指针s一个指针j,如下图 设置一个计数器1.当重复元素超过2时就将当前元素后面的所有元素向前移一位。移完之后因为之前s指针指向的还是之前的位置因此要减一。只有发生移位时数组的长度才会发生变化。2.当两个元素不相同时就将s指针指向j并且将计数器重置为1。
#includeiostream
#includevector
#includealgorithm
using namespace std;class Solution {
public://将数组当前的这个删除并且移动元素void move(vectorint nums,int pre){for(int ipre ; inums.size()-1 ; i){nums[i]nums[i1];}}int removeDuplicates(vectorint nums) {int countnums.size();//记录nums的元素个数int snums.size()-1; //指针swhile (s1) //只剩最后一个元素时不用再检查了{ int renum1;//计数器自己就是一个所以设置为1for(int js-1;j0;j--){if(nums[s]nums[j]){renum;//每次删除操作时数组的长度就减 1if(renum2){move(nums,j);s--;count--;}}else{sj;renum1;}}}return count;}};
int main(){vectorint nums{1,1,1,2,2,3};Solution s;couts.removeDuplicates(nums);
}