欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-15 14:38:18
...

题目:删除排序数组中的重复项[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算法模板解释:
题目:删除排序数组中的重复项[leetcode初级算法——数组——1]
我最开始希望用的是python3,但是看到这个模式直接懵掉,后来经过CSDN上一些大佬的博客分享,对于这个模式有了一点理解:
我们先来对比一下其他语言编程的格式:
题目:删除排序数组中的重复项[leetcode初级算法——数组——1]
这是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。

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