从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

示例 1:

给定数组 nums = [1,1,2], 
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2你不需要考虑数组中超出新长度后面的元素。
class Solution {
 public:
// 6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

// 7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)
            return 0;
        if(nums.size()==1)
            return 1;
        int n=nums[0];
        for(int i=1;i<nums.size();i++){
            if(n==nums[i]){
            i--;
            nums.erase(nums.begin()+i);
            }
            else{
                n=nums[i];
            }
        }
          return nums.size();

    }
  
};

 java 实现  思路

设立 一个区域【start end   (储存着元素下标)】 保存着重复元素 并且将该区域一点点的移动到数组尾部 

import java.util.Arrays;
class Solution {
    public int removeDuplicates(int[] nums) {
        //Arrays.sort(m);
        if(nums.length==1 )
            return 1;
         if(nums.length==0 )
            return 0;
        int start=-1;
        int end = -1;
        //已知数组是升序

        //record记录前一个数值   当前数值为nums[i]
        int record =nums[0];
        for(int i = 1; i < nums.length; i++){
            int temp;  
               //遇到重复元素     
            if( nums[i] == record){
               // start end 为-1 意味着首次添加元素
              if(start == -1 && end == -1)
              {
               start = i;
                end = i;
              }
                //扩展 重复元素区域
              else{
                end +=1;
              }
            }
            //将该区域右移一位 
            if( i-1 == end )
            {
                record = nums[i];
                temp = nums[start];
                nums[start] = nums[i];
                nums[i] = temp;
                start += 1;
                end +=1;
             
            }
            else{
            record = nums[i];
            }
        }
        if(start!=-1)
        nums = Arrays.copyOfRange(nums,0,start);
        return nums.length;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值