首先要明白leetcode的尿性....力扣题目的数据范围很抽象。然后记住三句话
第一一句话:
题目放在两个数组中分析(利用数组元素拷贝的思想),再把一个数组看成两个数组取解题。
其次:
如:看好给你的数据范围(防止出现漏掉某种最简单的情况!)
最后:
在数组中修改数据的时候,nums[0] 和 nums[numsSize - 1] 即首个元素和最有一位元素需要检验一下,有没有达到题目的数据要求!
给你一个 非严格递增排列 的数组 nums
,请你**原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
数据范围:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
注意:尿性的来了!nums.length可以为 1 !
因此需要特殊考虑数据的两端范围!!!
题目解析:
我们按照两个数组去分析,可以将第一个数组中没有重复的元素拷贝到第二个数组中!
比如将1 1 2 3 4 5 5 6 7没有重复的元素1 2 3 4 5 6 7拷贝到另一个数组中,达成题目的要求。
然后在一个数组中,完成所有的操作!!!
int removeDuplicates(int* nums, int numsSize) {
int src = 0;
int dest = 0;
if(numsSize == 1) //需要单独考虑只有一个元素的情况
{
return 1;
}
while(src < numsSize - 1)
{
if(nums[src] != nums[src + 1])
{
nums[dest++] = nums[src++];
}
else
src++;
if(src == numsSize - 1)
nums[dest++] = nums[src];
}
return dest; //由于前面的语句nums[dest++],所以此时dest就是新数组的长度
}