内容简介:不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。错误思路:由26题跳过一个的思路,很自然的联想到跳过2个即可。但是对于{0,0,1,1,1,1,2,3,3}这种情况,最后一个3无法被放到前面去,结果是{0,0,1,1,2,3,2,3,3},这是因为错误代码将第一个不同的值移动到正确位置以后,下一个和刚被移动的这个值比对如果相同的话,是要等待下一次移动的,而下一次已经到了数组末尾,不再进行移动操作。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
错误思路:
由26题跳过一个的思路,很自然的联想到跳过2个即可。但是对于{0,0,1,1,1,1,2,3,3}这种情况,最后一个3无法被放到前面去,结果是{0,0,1,1,2,3,2,3,3},这是因为错误代码将第一个不同的值移动到正确位置以后,下一个和刚被移动的这个值比对如果相同的话,是要等待下一次移动的,而下一次已经到了数组末尾,不再进行移动操作。
所以增加针对最后一个元素的处理(因为我只想到了最后一个元素可能和刚被移动的元素相同的情况),但是又引发了一个bug,即{1,1,1,2,2,3}->{1,1,2,2,3,3},当全部移动完成后,我会单独去比较最后一个元素是否和刚被移动的相同,相同的话,直接放到刚被正确安放的元素后,这样就导致了重复数据的出现。
public static int removeDuplicates(int[] nums) { int i = 0, j = 0, count=1; for(i = 1; i < nums.length; i++) { if(nums[i] != nums[j]) { if (count >= 2) { j = j + 2; nums[j] = nums[i]; } else { j = j + 1; nums[j] = nums[i]; } count = 1; } else { count++; } } if (nums[nums.length - 1] == nums[j]) { j = j + 1; nums[j] = nums[nums.length - 1]; } System.out.println(j+1); return j+1; }
正确思路:
public int removeDuplicates(int[] nums) { int i = 0, j = 0, count=1; for(i = 1; i < nums.length; i++) { if(nums[i] == nums[i-1]) { count++; } else { count = 1; } if (count <= 2) { j = j + 1; nums[j] = nums[i]; } } System.out.println(j+1); return j+1; }
1.对于每一个元素,都进行移动。
2.计算相同的个数,相同的数量在2个以上时,就不进行移动
3.不是比较nums[i]和nums[i+1],因为这样会导致溢出,参见26题的错误思路。或者比较不到最后一个对象。
以上所述就是小编给大家介绍的《leetcode刷题记录--【80 Remove Duplicates from Sorted Array II】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网+ 战略版
刘润 / 中国华侨出版社 / 2015-5-1 / 49.8
1、“互联网+”上升为国家战略,“互联网+”成为下一个超级畅销书的热点话题在商业环境巨变的今天,传统企业该怎么走?传统企业转型是一个系统工程,如何定战略、抓主要矛盾? 2、首本“互联网+传统企业”的战略指导书。“我互联网+”时代到来了,传统企业的外部环境发生了哪些变化?了解商业新生代的新商业环境,跟之前工业时代的不同,从战略上指导传统企业转型,更安全也更大局把握游刃有余。一起来看看 《互联网+ 战略版》 这本书的介绍吧!