LeetCode 26_Remove Duplicates from Sorted Array

又有一段时间没有更新了,时间是非常的不够用啊,今天抽点儿时间,多刷几道吧。

这次是leetcode第26题,题目难度是属于easy的那种。并没有涉及什么高深算法,属于刚学C时练手的题目。这种题目对于我们来说是应该一次通过的,如果这个还要修修补补那只能说明你态度不端正了。

废话不多说,看题

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array nums = [1,1,2],

Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the new length.

看完题,我想有一部分人该后悔没好好学English了吧。英语嘛,有时间还是要多学一学的,否则以后动辄就得百度翻译。我来给大家翻译一下吧。

给定一个有序数组,删除其中重复的数字使得每个数字仅出现一次。要求不能重新开辟新的数组空间即空间复杂度只能为O(1)。函数应该返回新的数组长度,新数组长度后面的旧数组部分中的内容不做要求。

这个题目前面就是要求了,最后面那句话可能有些人搞不明白,什么意思呢?就是说你把重复数字删除了,原先在后面的数字复制到前面去了,后面原先的位置可能还有数字,这些数字可以保留,程序只要求返回长度前的部分正确就可以了。说得更直白一点儿,就是后面空出来的位置不用赋0了。

这题目最原始的思路是一个一个删除,每删除一个都把后面的依次往前移动一个位置,就像顺序表中的元素删除一样。但这里有个问题,因为有可能有很多相同的元素,这样一来就会对某些元素进行反复移动,这无疑会增加算法的时间复杂度。我们应该尽量使元素一次到位,即用一次历遍来完成操作。这个技巧虽小,但可以很大程度上降低算法的时间复杂度,是值得我们学习的。到底怎么实现呢,看了代码就知道了

<span style="font-size:14px;">class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
		vector<int>::size_type len = nums.size();
		if(len==0) return 0;
		if(len==1) return 1;
		vector<int>::size_type beg = 0;
		vector<int>::size_type end = 1;
		while(end != len){
			if(nums[end]!=nums[beg])
				nums[++beg] = nums[end];
			end++;
		}
		return beg+1;
        
    }
};</span>
显然代码的时间复杂度为O(n),空间复杂度为O(1)。

代码没什么好说的,尽量做到精简和易读就可以了。其中易读是大于精简的,还是那句话,编程是让人看的,不要秀技巧。

值得多嘴说两句的地方有两点,一是数据类型问题,这个问题是每个学编程语言第一课学的东西。但很多人对此并不是非常重视,我们要求一定要用最合适的数据结构,而不是一直int,int,int。C++里面有一些数据类型是专有的,比如表示数组下标的size_t和这里的string::size_type。虽然这些类型大多数情况都可以用int代替,但为了可读性和安全性,还是提倡该用更为合适的类型的。还有一点要说的是指针和下标的问题,我们历遍数组可以用下标,也可以用指针,按照理论来说是指针更快一点儿,因为没有计算偏移量的过程。而下标可读性更好一点儿,至于该怎么取舍,就看每个人的习惯了。如果是编写复杂算法,本人还是倾向于用下标的,因为毕竟更熟悉一点儿。如果对速度要求比较高,那可以后面调试成功后再改为指针。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值