题目描述:
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.
示例Input:[1,1,2]
示例Output : 2
大白话:
输入一个数组,然后我们返回数组去重后的长度。题目乍眼一看挺简单的,唯一的难点就是不能申请额外空间
原题目连接:26. Remove Duplicates from Sorted Array
思路一:[Time Limit Exceeded]
读完题目之后“首当其冲”[首先冲到脑子里]的思路就是:
比较数组里的数据前一个与后一个是否相同,如果相同则在数组里去掉那一个,然后返回新的数组长度。
代码示例:
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
for(var i = 0;i<nums.length-1;i++){
for(var j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
nums.splice(j,1);
j--;
}
}
}
return nums.length;
};
这个思路可以说就是把题目翻译了一下顺着做,而且我知道,以我的菜鸟惯性,首当其冲的思路绝对不是什么好思路。。。 = =
虽然运行是对的但是emmmm……果不其然,超时了
思路二:
在不申请额外数组存放的前提下,百思不得其解后,终于一个想法憋出来了..还算是以一个尚算优美的姿态AC了[得意の笑]
运行时间 149ms
老规矩先贴代码
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
var j = 0;
for(var i=1;i<nums.length;i++){
if(nums[i]!=nums[j]){
j++;
if(i!=j){
nums[j]=nums[i];
}
}
}
return j+1;
};
思路:
妙就妙在用nums[j]=nums[i]的方法存储了未重复的数据,避免了新开额外数组空间存放。
让标记i从数组的第二个元素开始循环,标记j从第一个元素开始,[j=0,i=1]
如果第i个元素与第j个元素相同,那么不管;
如果第i个元素与第j个元素不同,则j++,并让nums[j]=nums[i];
从而前j个数据全是未重复的数据,长度即是j+1;
以测试数据[1,1,2,3,4,4]为例