赞
踩
题目:
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
nums
,使 nums
的前 k
个元素包含唯一元素,并按照它们最初在 nums
中出现的顺序排列。nums
的其余元素与 nums
的大小不重要。k
解答
这里可用两种做法
法一.三层for循环遍历(容易想出,但是时间复杂度太大)
- int removeDuplicates(int* nums, int numsSize) {
- for(int i=0;i<numsSize;i++)
- {
- for(int j=i+1;j<numsSize;j++)
- {
- if(nums[i]==nums[j])//如果有相同的元素
- {
- for(int k=j;k<numsSize-1;k++)//将后面的元素往前移实现删除操作
- {
- nums[k]=nums[k+1];
- }
- numsSize--;//删除后数组长度减小1
- j--;//防止3个或3个以上连续的相同元素
- }
- }
- }
- return numsSize;//此时的numsSize就是数组唯一元素个数
- }
这里运行后需要时间太多,不好。
法二:双指针
定义两个指针 fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。(0号下标不用比较)
时间复杂度小
- int removeDuplicates(int* nums, int numsSize) {
- if (numsSize == 0) {
- return 0;
- }
- int fast = 1, slow = 1;
- while (fast < numsSize) {
- if (nums[fast] != nums[fast - 1]) {
- nums[slow] = nums[fast];
- ++slow;
- }
- ++fast;
- }
- return slow;
- }
这里运行后仅需16ms
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。