26.从排列二维数组中删除重复项

非常容易的

给出一个排列的二维数组nums,就地删掉反复的原素,那样每一个原素只发生一次,并回到新的长短。

不必为另一个二维数组分派附加的室内空间,您务必根据用O(1)个附加运行内存就地改动键入二维数组来保证这一点。

回应:

疑惑为何传参是整数金额而你的答案是二维数组?

一定要注意,键入二维数组是根据引入传送的,这代表着入参也了解对键入二维数组的改动。

在內部,你能那样想:

// nums is passed in by reference. (i.e., without making a copy)int len = removeDuplicates(nums);// any modification to nums in your function would be known by the caller.// using the length returned by your function, it prints the first len elements.for (int i = 0; i < len; i ) { print(nums[i]);}

例1:

Input: nums = [1,1,2]Output: 2, nums = [1,2]Explanation: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 returned length.

例2:

Input: nums = [0,0,1,1,1,2,2,3,3,4]Output: 5, nums = [0,1,2,3,4]Explanation:Your function should return length = 5, with the first five elements of nums being modified to0, 1, 2, 3, and4 respectively. It doesn't matter what values are set beyondthe returned length.

牵制要素:

0 -104 nums is sorted in ascending order.

给出一个井然有序二维数组,删掉反复的內容,使每一个原素只发生一次,并回到新的长短。

规定不必为别的二维数组分派附加的空室内空间,可是您需要在O(1)个附加运行内存中就地改动键入二维数组才可以做到这一点。

思索解决困难:

这是一个简易的难题。已经知道标准二维数组是排名的,不可以建立新二维数组。这告知大家,除开建立数组指针,大家只有变更给出的二维数组来得到結果。

class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if (n == 0) { return 0; //最先清除界限的case } int counter = 0, i = 1; //界定2个表针,counter意味着当今去重复的长短,i是解析xml的表针,为何i是以1逐渐? 由于起止部位的二维数组原素早已测算到結果中,因此逐渐从二个原素解析xml while(i < n) { if (nums[counter] == nums[i]) { //分辨当今解析xml的二维数组原素和去重复后的较大二维数组原素是不是同样,假如不同则再次解析xml,不做一切实际操作。 i ; } else { //假如不一样,则将二维数组当今解析xml的原素更换到去重复二维数组 counter ; //在更换前最先将去重复表针后退一位 nums[counter] = nums[i]; i ; //再次解析xml } } return counter 1; //counter是去重复表针的最终一位,因此长短必须加1 }}

汇总:这类列阵去重复的难题经常会出现在招聘面试阶段(3个月)。在我们见到数组去重时,一定要想起先向二维数组实现排列,随后根据一个n次遍历年来解决困难。

除此之外,它不需要附加的空,只建立一个新的表针和当今给出的二维数组开展实际操作。

评论(0条)

刀客源码 游客评论