顺序表之有序顺序表重复元素删除

(2.2.4-6)从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

  • 不考虑时间复杂度,空间复杂度为o(1)

思路:例SqList L = { 1, 2, 2, 3, 4, 4 },将每一个元素与之后面的元素进行比较,1与2比较不相等不做任何处理,1再次与2比较不做任何处理,1与3比较不做任何处理…1与之后面的所有元素比较不做任何处理;2与2比较,相同第2个2删除即需要将之后的元素向前移动,3需要向前移动1步(即此轮(即内层循环的重复数)遍历的重复次数),后面的两个4需要向前移动1步;后面同理。内层每次比较完应该更新length为length-此轮重复次数。
代码如下:

void Delete_Same(SqList &L){
	//删除有序表重复值
	
	for(int i=0;i<L.length;i++)
	{
		int same=0;
		for(int j=i+1;j<L.length;j++){
			if (L.data[i] == L.data[j])
			{
				same++;
			}	
			else{
				L.data[j-same]=L.data[j];
			}
		}
		L.length=L.length-same;
	}
}
  • 时间复杂度为o(n),空间复杂度为o(1)

思路(转自https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-yuan-su-y/):
使用快慢双指针法 分别定义指针i与指针j,开始两指针都指向num[0],
快指针i向前移动 指向的数组与 慢指针j所知数组比较 num【j】!=num【i】
若相同则快指针向前移动一格,慢指针向前移动一格;若不同,将快指针i指向数组赋值给慢指针j,快慢指针分别向前移动一格;重复操作直到i指针指到末尾。
若数组长度为0则直接return 0;
最后 返回慢指针所指数组长度加一 return j+1。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i,j;
        int length=nums.size();
       
        if(length==0)//判断数组长度  若为0直接返回
        return 0;

        for (i=0;i<nums.size();i++)//采用for循环使指针i不停向前移动
    {
        if(nums[i]!=nums[j])
      {
        if(i-j>1) //判断快慢指针 若相邻数组且元素值不同时,虽然也可进行赋值操作,
                  //但可以省略该赋值操作,避免无意义操作提高运行效率
        {nums[j+1]=nums[i];}
          j++;
      }  
       
     }

 return j+1;

    }
};


  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值