内容简介:不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。划重点:1.排序数组 2.原地删除错误思路:
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
划重点:1.排序数组 2.原地删除
错误思路:
1.声明一个tmp,初始就是nums[0],用作被比较的对象
2.用tmp去和每一个后面的数去对比,相同的跳过,不同的,先把nums[j]设成tmp,然后j++,tmp变成不同的那个数
错误点:
1.使用了新的内存空间,是错误的
2.tmp要和后面的数去比,tmp如果走到了最后一个,那么后面必然会产生越界。
3.tmp最后一定是一个和前面不同的数,这个数不参与比较,那么一定不会被覆盖写入数组
比如{1,1,2,2,3,3}->{1,2,2,2,3,3}
public static int removeDuplicates(int[] nums)
{
int i = 0, j = 0;
int tmp = nums[0];
for(i = 1; i < nums.length; i++)
{
if(nums[i] == tmp)
{
continue;
}
else
{
nums[j] = tmp;
tmp = nums[i];
j++;
}
}
System.out.println(j+1);
return j+1;
}
思路:
要求原地删除,那么一定使用快慢指针进行元素的覆盖操作。
声明两个指针,i为快指针,j为慢指针
如果遇到相同的数,那么就跳过,i++。
如果遇到不同的数,将这个值的下一个数给替换成这个不一样的值。
public static int removeDuplicates(int[] nums)
{
int i = 0, j = 0;
for(i = 1; i < nums.length; i++)
{
if(nums[j] == nums[i])
{
continue;
}
else
{
j++;
nums[j] = nums[i];
}
}
System.out.println(j+1);
return j+1;
}
代码写的不够优雅,因为判断相等然后continue是没有必要的,优化一下:
public static int removeDuplicates(int[] nums)
{
int j = 0;
for(int i = 1; i < nums.length; i++)
{
if(nums[j] != nums[i])
{
j++;
nums[j] = nums[i];
}
}
return j+1;
}
复杂度分析:
遍历一遍,时间复杂度o(n)
空间复杂度,o(1)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Designer Idea
梁景红 / 电子工业出版社 / 2006年 / ¥55.00
这是一本以“目的、信息、设计、创意”作为根脉的关于网页视觉的书籍,畅谈的话题从策划到编辑再到设计,从而讨论“我们要建立怎样的站点,并以何种形式完成它”的问题。 全书共分四个部分,分别是网站建设目的,网站信息内容,页面形式设计,网页创作构思。 四部分有机地结合,形成一个统一的整体。“目的”部分以建设网站的目的为主,带领设计师从建站目的的角度,探讨如何抓住首要问题;如何建立网站雏形;如何打开狭隘的、局......一起来看看 《Web Designer Idea》 这本书的介绍吧!