1. 题目

1.1 英文题目

Given an integer array nums sorted in non-decreasing order, remove the duplicates in-placein-place such that each unique element appears only once. The relative order of the elements should be kept the same.

Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the first part of the array nums. More formally, if there are k elements after removing the duplicates, then the first k elements of nums should hold the final result. It does not matter what you leave beyond the first k elements.

Return k after placing the final result in the first k slots of nums.

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

1.2 中文题目

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

1.3输入输出

输入 输出
nums = [1,1,2] 2, nums = [1,2,_]
[0,0,1,1,1,2,2,3,3,4] 5, nums = [0,1,2,3,4,,,,,_]

2. 实验平台

IDE:VS2019

IDE版本:16.10.1

语言:c++11

3. 程序

3.1 测试程序

#include "Solution.h"
#include <vector> // std::vector
#include<iostream> // std::cout
using namespace std; // 主程序
void main()
{
vector<int> nums = { 0,0,0,1,1,1,2,2,3,4,4 }; // 输入
Solution solution; // 实例化Solution
int k = solution.removeDuplicates(nums); // 主功能 // 输出
cout << k << ", [";
for (int i = 0; i < k; i++)
{
if (i == k - 1)
cout << nums[i] << "]";
else
cout << nums[i] << ",";
}
}

3.2 功能程序

3.2.1 最佳程序

(1)代码

#pragma once
#include<vector> // std::vector
using namespace std; //主功能
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
if (nums.size() > 1)
{
int i; // i为慢指针,指向的是去重后最后一位,随j更新
int j; // j为快指针,不断向前探索
for (i = 0, j = 0; j < nums.size(); j++)
{
if (nums[i] != nums[j]) // 若快指针所指元素与慢指针相同,则慢的不动,快的前进一步
nums[++i] = nums[j]; // 若不同,则慢的前进一步指向快指针指的元素,快指针继续向前一步
}
return i + 1; // 因为下标从0开始,所以去重后的元素个数为i+1
}
}
};

此程序参考:https://blog.csdn.net/qjh5606/article/details/81434396

(2)解读

快慢指针,慢的指向的一直都是新的,也就是说来一个新的它才往前走一步,快的就是不断向前,发现和慢的不一样的就汇报给那个慢的,然后慢的更新。如果二者相等,则慢的不动,快的前进一步;如果二者不等,则慢的前进一步的同时更新那个新一步指向的数字为现在快指针指向的新数字,快的同时也往前走一步。

解读参考:https://www.cnblogs.com/forPrometheus-jun/p/10889152.html

3.2.2 自写程序

(1)代码

#pragma once
#include<vector> // std::vector
#include<algorithm> // std::find
using namespace std; //主功能
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
if (nums.size() > 1) // 若nums不是空集合或单元素集合
{
int i = 1;
while (i != nums.size())
{
if (nums[i] == nums[i - 1]) // 若元素重复
nums.erase(find(nums.begin(), nums.end(), nums[i])); //则去除重复数字
else // 若元素不重复
i += 1; // 则向后再查看一个元素
}
}
return nums.size(); // 返回结果
}
};

(2)思路

从前往后遍历,如果发现有元素重复,则将重复元素剔除

3.2.3 其他程序

(1)代码

#pragma once
#include<vector> // std::vector
#include<algorithm> // std::unique
using namespace std; class Solution {
public:
int removeDuplicates(vector<int>& nums) {
nums.erase(std::unique(nums.begin(), nums.end()), nums.end());
return nums.size();
}
};

(2)解读

该程序直接使用 c++标准模板库STL中的函数std::unique查找重复元素,更简洁。

4. 相关知识

(1) 快慢指针(Fast-Slow Pointer)

这几个教程挺不错的,可以参考一下:

https://www.cnblogs.com/hxsyl/p/4395794.html

https://blog.csdn.net/SoftPoeter/article/details/103153564

https://zhuanlan.zhihu.com/p/361049436

(2) i++与++i的区别

  • i++ 即后加加,原理是:先自增,然后返回自增之前的值
  • ++i 即前加加,原理是:先自增,然后返回自增之后的值

参考:https://blog.csdn.net/android_cai_niao/article/details/106027313

Leetcode No.26 Remove Duplicates from Sorted Array(c++实现)的更多相关文章

  1. [Leetcode][Python]26: Remove Duplicates from Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 26: Remove Duplicates from Sorted Array ...

  2. C# 写 LeetCode easy #26 Remove Duplicates from Sorted Array

    26.Remove Duplicates from Sorted Array Given a sorted array nums, remove the duplicates in-place suc ...

  3. 【leetcode】 26. Remove Duplicates from Sorted Array

    @requires_authorization @author johnsondu @create_time 2015.7.22 18:58 @url [remove dublicates from ...

  4. 【一天一道LeetCode】#26. Remove Duplicates from Sorted Array

    一天一道LeetCode系列 (一)题目 Given a sorted array, remove the duplicates in place such that each element app ...

  5. 【LeetCode】26. Remove Duplicates from Sorted Array 解题报告(Python&C++&Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 [LeetCode] https:// ...

  6. 【LeetCode】26. Remove Duplicates from Sorted Array

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  7. LeetCode OJ 26. Remove Duplicates from Sorted Array

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  8. LeetCode:26. Remove Duplicates from Sorted Array(Easy)

    1. 原题链接 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 2. 题目要求 给定一个已 ...

  9. 【一天一道LeetCode】#80. Remove Duplicates from Sorted Array II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

随机推荐

  1. linux中用iptables开启指定端口

    linux中用iptables开启指定端口   centos默认开启的端口只有22端口,专供于SSH服务,其他端口都需要自行开启. 1.修改/etc/sysconfig/iptables文件,增加如下 ...

  2. 元素定位工具ChroPath - Chrome浏览器插件

    一 ChroPath的作用 可以自动识别元素定位表达式,对于系统需要定位元素多时,可使用这种方法减轻定位工作量,但需要验证 二 ChroPath的安装 下载ChroPath -> 在谷歌浏览器访 ...

  3. Map / Set / Treeset 取出指定下标index的元素

    Treeset 属于 set  集合中的一种数据类型,HashSet 以及LinkedHashSet 原理相同 需求:想直接在Treeset类型下,取出指定下标的元素,但是Set 下没有 get()方 ...

  4. Lidar激光雷达市场

    Lidar激光雷达市场 近年来,激光雷达技术在飞速发展,从一开始的激光测距技术,逐步发展了激光测速.激光扫描成像.激光多普勒成像等技术,如今在无人驾驶.AGV.机器人等领域已相继出现激光雷达的身影. ...

  5. 深度学习编译与优化Deep Learning Compiler and Optimizer

    深度学习编译与优化Deep Learning Compiler and Optimizer

  6. AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(四) Nightmare 从前,在一所大学的大楼里,西蒙尼亚.维达第和齐瑟曼有一个很好的主意,几乎和你现在坐的大楼完全不同.他们想,嘿 ...

  7. 【问题记录】—SignalR连接断线重连

    起因: ASP.NET Core SignalR是一个开源库,可简化向应用添加实时 SignalR Web 功能. 实时 Web 功能使服务器端代码能够立即将内容推送到客户端.(相信大家都用得比较多了 ...

  8. 【NX二次开发】点到矢量或直线的垂点

    已知p1.p2.v1求p0 求解: 通过P1点和P2点,先求出v2: 使用 UF_VEC3_dot(),v1点乘v2得到P0与P2之间的距离: 使用UF_VEC3_unitize()将v1单位化: p ...

  9. .Net Core with 微服务 - Consul 注册中心

    上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...

  10. spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...