C++实现LeetCode(26.有序数组中去除重复项)

 更新时间:2021年07月13日 17:15:02   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(26.有序数组中去除重复项),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

Example 1:

Given nums = [1,1,2],

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.

Example 2:

Given nums = [0,0,1,1,1,2,2,3,3,4],

Your function should return length =

5

, with the first five elements of

nums

being modified to 

0

,

1

,

2

,

3

, and 

4

respectively.

It doesn't matter what values are set beyond the returned length.

Clarification:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// 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]);
}

这道题要我们从有序数组中去除重复项,和之前那道 Remove Duplicates from Sorted List 的题很类似,但是要简单一些,因为毕竟数组的值可以通过下标直接访问,而链表不行。那么这道题的解题思路是使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数,代码如下:

解法一:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int pre = 0, cur = 0, n = nums.size();
        while (cur < n) {
            if (nums[pre] == nums[cur]) ++cur;
            else nums[++pre] = nums[cur++];
        }
        return nums.empty() ? 0 : (pre + 1);
    }
};

我们也可以用 for 循环来写,这里的j就是上面解法中的 pre,i就是 cur,所以本质上都是一样的,参见代码如下:

解法二:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int j = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            if (nums[i] != nums[j]) nums[++j] = nums[i];
        }
        return nums.empty() ? 0 : (j + 1);
    }
};

这里也可以换一种写法,用变量i表示当前覆盖到到位置,由于不能有重复数字,则只需要用当前数字 num 跟上一个覆盖到到数字 nums[i-1] 做个比较,只要 num 大,则一定不会有重复(前提是数组必须有序),参见代码如下:

解法三:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i = 0;
        for (int num : nums) {
            if (i < 1 || num > nums[i - 1]) {
                nums[i++] = num;
            }
        }
        return i;
    }
};

到此这篇关于C++实现LeetCode(26.有序数组中去除重复项)的文章就介绍到这了,更多相关C++实现有序数组中去除重复项内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • opencv3机器学习之EM算法示例详解

    opencv3机器学习之EM算法示例详解

    这篇文章主要介绍了opencv3机器学习之EM算法的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C++实现基于时序公平的读写锁详解

    C++实现基于时序公平的读写锁详解

    读写锁与普通的互斥锁的区别在于有两种上锁方式:读锁和写锁,不用的用户对同一个读写锁获取读锁是非互斥的,其他情况则是互斥的,本文小编将给大家详细介绍C++实现基于时序公平的读写锁,需要的朋友可以参考下
    2023-10-10
  • 浅析如何在c语言中调用Linux脚本

    浅析如何在c语言中调用Linux脚本

    如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
    2013-08-08
  • C语言 深入浅出讲解指针的使用

    C语言 深入浅出讲解指针的使用

    指针是C语言中一个非常重要的概念,也是C语言的特色之一。使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值
    2022-03-03
  • 基于C++ Lambda表达式的程序优化

    基于C++ Lambda表达式的程序优化

    这篇文章主要介绍了基于C++ Lambda表达式的程序优化的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • C++实现学生信息管理系统(Map实现)

    C++实现学生信息管理系统(Map实现)

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析

    以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • C语言版实现链队列

    C语言版实现链队列

    这篇文章主要为大家详细介绍了C语言版实现链队列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • C语言学习之标识符的使用详解

    C语言学习之标识符的使用详解

    C语言标识符是用于表示变量、函数、常量、类型等程序元素的名称,这篇文章将通过一些简单的示例为大家介绍一下C语言标识符的使用,需要的可以参考一下
    2023-05-05
  • C/C++ - 从代码到可执行程序的过程详解

    C/C++ - 从代码到可执行程序的过程详解

    这篇文章主要介绍了C/C++ - 从代码到可执行程序的过程,主要有预编译和编译,汇编链接,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01

最新评论