题目:删除排序数组中的重复项[leetcode初级算法——数组——1]

题目:删除排序数组中的重复项[leetcode初级算法——数组——1]
·给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
·示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
·示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4];函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
·注意:你不需要考虑数组中超出新长度后面的元素。
·说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

涉及的知识点:
1、原地算法:
在算法执行过程中,输出结果利用的是已经存在的存储空间和数据结构,而不是新开辟一块存储空间进行存储,但是允许使用少量的辅助变量,但是辅助变量不会用来长久存储最终结果。
2、Python算法模板解释:
python语言模式
我最开始希望用的是python3,但是看到这个模式直接懵掉,后来经过CSDN上一些大佬的博客分享,对于这个模式有了一点理解:
我们先来对比一下其他语言编程的格式:
在这里插入图片描述
这是C++的模板,它定义了一个类,名叫Solution。在类里面,定义了一个公有函数removeDuplicates,这就是我们需要编码的函数。函数引用了nums数组,这和题目里面的说明内容也是一致的。至于vector& nums的格式,vector是C++里面定义数组的语言格式,vector nums (C++)== int nums。详细的说明还请看大佬博客:
参考博客——vector
而python中,类比C++的模式,也是定义一个名叫Solution的类,然后定义了一个解决问题的函数,留给我们实现。Python中函数定义的一般格式是:

Def functionName():
	函数主体

而在这里,类中函数需要一个额外的参数名称——self,调用时候我们不需要为它赋值
指路大佬博客:
参考博客——self in python
而nums: List[int]表示形参为一个int类型的列表nums,->int表示返回一个int型数。

3、正式题目分析

个人思路:
一开始我的解题思路相当简单,定义一个compare_num,初始值为nums[0],之后遍历数组,如果和compare_num相同,那么就删去这个值,后面的数据向前挪一个下标,如果不相同,那么更改compare_num的值,开始新一轮比较。
提交运行,叭,超时了。。。

提交思路:
之后看博客看到一个可行思路(C语言):

int removeDuplicates(int* nums, int numsSize){  
        if(numsSize==0) 
			return 0;
        int i = 0;//i用来记录数组中不同数字的个数,同时在第一次for循环中来代表数组的0号元素
        for (int j = 1; j < numsSize; j++) {
            if(nums[j]!=nums[i]){//如果i号元素和j号元素不相同,则i增加一位
                i++;
                nums[i]=nums[j];//此时用nums[i]记录nums[j]的数值,然后进行循环
            } //如果数值相同,则只需将j往后一位,直到nums[i]==num[j]
        }
        return i+1;//返回值+1,即代表数值不同的个数
}

简单说明:i用来记录最终的返回值,数据在原来的数组里面进行赋值操作,当遍历的数值和nums[i]相同时,继续遍历;当两者不等时,将遍历数值写在第i个数组下标。i相当于一个排名值,第一个不重复的数放在0号位,第二个不重复的数放在1号位……,最终得到的nums[0]~nums[i]就是不含重复数据的数组,返回数组长度就是i+1。

之后再考虑其他算法思路和其他语言书写吧,今天就先到这了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值