当前位置:   article > 正文

【c语言】力扣26.删除有序数组中的重复值_c语言删除有序数组的相同数

c语言删除有序数组的相同数

题目:

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 

解答

这里可用两种做法

法一.三层for循环遍历(容易想出,但是时间复杂度太大)

  1. int removeDuplicates(int* nums, int numsSize) {
  2. for(int i=0;i<numsSize;i++)
  3. {
  4. for(int j=i+1;j<numsSize;j++)
  5. {
  6. if(nums[i]==nums[j])//如果有相同的元素
  7. {
  8. for(int k=j;k<numsSize-1;k++)//将后面的元素往前移实现删除操作
  9. {
  10. nums[k]=nums[k+1];
  11. }
  12. numsSize--;//删除后数组长度减小1
  13. j--;//防止3个或3个以上连续的相同元素
  14. }
  15. }
  16. }
  17. return numsSize;//此时的numsSize就是数组唯一元素个数
  18. }

这里运行后需要时间太多,不好。

法二:双指针

定义两个指针 fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。(0号下标不用比较)

时间复杂度小

  1. int removeDuplicates(int* nums, int numsSize) {
  2. if (numsSize == 0) {
  3. return 0;
  4. }
  5. int fast = 1, slow = 1;
  6. while (fast < numsSize) {
  7. if (nums[fast] != nums[fast - 1]) {
  8. nums[slow] = nums[fast];
  9. ++slow;
  10. }
  11. ++fast;
  12. }
  13. return slow;
  14. }

这里运行后仅需16ms

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/434422
推荐阅读
相关标签
  

闽ICP备14008679号