leetcode笔记:Remove Duplicates from Sorted Array
2015-07-23 17:14
323 查看
一.题目描述
二.解题技巧
从题目中可知,数组中的元素事先已经过排序,因此一个简单而易于实现的方法是从第二个元素开始对数组元素进行遍历,并判断该元素是否和前面的元素相同。题目要求返回不重复的元素的个数。
算法的一个要求是:返回的数组的元素都是不重复,同时要求remove duplicates in place,这意味着不能重新定义一个数组来保存不重复的元素。假设该数组为A,为了满足这一要求,可以设置一个变量num来保存不重复的元素的个数,然后遍历整个数组A,如果该元素A[i]!=A[i-1]的话,将第i个元素复制到A的num位置,也即是A[num]=A[i],然后将num加1.
主要的注意点是,如果数组的元素个数小于2的话,就可以提前结束函数了。
三.示例代码
测试代码:
一个输出结果:
网上一种使用STL的解决思路如下:
四.体会
这道题本身无需排序,只需判断元素与前一个元素是否相同就知道该元素是不是重复的,同时,记录已经遍历过的元素中不重复的元素的个数的变量也同时记录了下一个不重复的元素在数组中的存放位置。算法实现较为简单,当然,可能存在其他更简单的思路。
二.解题技巧
从题目中可知,数组中的元素事先已经过排序,因此一个简单而易于实现的方法是从第二个元素开始对数组元素进行遍历,并判断该元素是否和前面的元素相同。题目要求返回不重复的元素的个数。
算法的一个要求是:返回的数组的元素都是不重复,同时要求remove duplicates in place,这意味着不能重新定义一个数组来保存不重复的元素。假设该数组为A,为了满足这一要求,可以设置一个变量num来保存不重复的元素的个数,然后遍历整个数组A,如果该元素A[i]!=A[i-1]的话,将第i个元素复制到A的num位置,也即是A[num]=A[i],然后将num加1.
主要的注意点是,如果数组的元素个数小于2的话,就可以提前结束函数了。
三.示例代码
#include <iostream> using namespace std; class Solution { public: int removeDuplicates(int A[], int n) { if (n < 2) return 0; // 数组元素个数小于2时无需执行算法 int num = 0; for (int i = 1; i < n; i++) { if (A[num] != A[i]) A[++num] = A[i]; } return num + 1; } };
测试代码:
#include "solution.h" #include <algorithm> int main() { int num = 50; int number[50]; for (int i = 0; i < num; i++) number[i] = rand() % 10 - 10; sort(number, number + num); // 先对数组进行排序 cout << "输入的数组(已排序):" << endl; for (int j = 0; j < num; j++) cout << number[j] << " "; cout << endl << endl; Solution remove; int index = remove.removeDuplicates(number, num); // 执行算法 cout << "去除重复元素后的数组:" << endl; for (int k = 0; k <index; k++) cout << number[k] << " "; cout << endl; cout << "数组元素的剩余个数:" << index << endl; getchar(); return 0; }
一个输出结果:
网上一种使用STL的解决思路如下:
// 算法的时间复杂度O(n),空间复杂度O(1) class Solution { public: int removeDuplicates(int A[], int n) { return removeDuplicates(A, A + n, A) - A; } template<typename InIt, typename OutIt> OutIt removeDuplicates(InIt first, InIt last, OutIt output) { while (first != last) { *output++ = *first; first = upper_bound(first, last, *first); } return output; } };
四.体会
这道题本身无需排序,只需判断元素与前一个元素是否相同就知道该元素是不是重复的,同时,记录已经遍历过的元素中不重复的元素的个数的变量也同时记录了下一个不重复的元素在数组中的存放位置。算法实现较为简单,当然,可能存在其他更简单的思路。
相关文章推荐
- unity3d基础02
- apache 开机自启动脚本设置
- csharp: 用Enterprise Library对象实体绑定数据
- 我进公司当Android开发实习生时,初中最差的同学成了我的领导
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- 使用Android编写录制视频小程序示例
- Hduoj1869【Floyd】
- C++ Primer 复习杂记(第四章)
- 删除Mysql数据库的表空间,日志文件
- 一步步构建3D引擎-------架构设计
- SHELL入门教程(6)-环境
- GRE写作必备句型
- apt-get安装软件 子进程返回了一个错误号(100)
- Handlebars模板引擎中的each嵌套及源码浅读
- SQL Server自定义函数
- C++静态变量使用方法
- jquery validationengine验证
- Activity背景毛玻璃
- AngularJS 基础入门(指令篇)
- java inputstream读取文件中的数据