算法练习:两指针之有序数组去重

问题描述

给出一个有序数组,就地移除重复元素,保持每个元素只出现一次,并返回新数组的长度。

问题分析

这个比较简单,直接使用两个指针,一个在前,一个在后,扫描一遍数组即可。时间复杂度为O(n^2)。

比如数组A = { 1,1, 2, 3, 3 },看下图,思想简单明了。

代码实现

#include <iostream>

using namespace std;

//去除数组中重复的数字,返回新数组的长度
int RemoveDuplicate( int nArray[], int nCount )
{
	int i = 0;
	int j = i + 1;
	for( ; j < nCount; ++j )
	{
		//j在i的前面走
		//如果两者值不同,则在i+1位置保存j位置的数值
		if( nArray[i] != nArray[j] )
		{
			nArray[++i] = nArray[j];
		}
	}

	return i + 1;
}

int main()
{
	int nArray[] = { 1, 1, 2, 3, 3 };
	int nLen = RemoveDuplicate( nArray, _countof( nArray ) );

	for( int i = 0; i < nLen; ++i )
	{
		cout << nArray[i] << " ";
	}
	cout << endl;

	return 0;
}

系列文章说明:

1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。

2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!

3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.

作者:山丘儿

转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46729477

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 12:04:30

算法练习:两指针之有序数组去重的相关文章

有序数组去重的几种算法

最差的算法: 最差的算法: 去重,与数组是否有序无关 public void noDups(){ //从0开始遍历 for(int i=0; i<nElems-1; i++){ //与后面每一个比较 for(j=i+1; j<nElems; j++){ //如果相等,后面的所有的项向前移动,总数-1 if(a[i]==a[j]){ for(k=j+1; k<nElems; k++){ a[j] = a[j+1]; nElems--; } } } } } 把后面不同的往前 public v

有序数组去重2--Remove Duplicates from Sorted Array II

https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/ Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For example,Given sorted array nums = [1,1,1,2,2,3], You

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

如何高效的对有序数组去重

给定一个排序数组,需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度 数组nums=[0,0,1,1,1,2,2,3,3,4] 函数应该返回新的长度为5,并且原数组nums的前五个元素被修改为0,1,2,3,4.不要使用额外的数组空间,必须在原地修改输入数据并在O(1)额外空间的条件下完成 分析: 对于问题.如果不要求空间和时间要求的话,还是很easy的.但是要求O(1)的时间.因此必须得另外想办法解决.这个的前提是有序数组,因此一样的数字都是排列在一起的.这里可以用到

4. 寻找两个游有序数组的中位数

给定两个大小为 m 和 n 的有序数组?nums1 和?nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为?O(log(m + n)). 你可以假设?nums1?和?nums2?不会同时为空 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 题解: 首先求中位数,两种情况: (1)假设两个数组的总长度是奇数, 那么其中位数是

iOS开发——有序数组去重的几种算法

算法,在学校的时候就掌握的不牢固,如今还是要还上了. NSMutableArray *dateMutablearray = [@[] mutableCopy]; NSArray *array1 = @[@"1",@"2",@"3", @"3",@"4",@"5",@"7",@"9",@"9", @"11",]

58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)

1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; public class E { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] str = sc.nextLine().split(","); int len

算法实战(四)寻找两个有序数组的中位数

一.前言 今天开始第四题,寻找两个有序数组的中位数.这个题leetcode的标记难度是困难,这一看可把我吓坏了,之前还没做过困难的题目.但是进去一看,感觉题目挺简单的,还小小的高兴了一会儿,以为是自己的水平变高了.结果打脸来的太快,漏看了一个条件,要求时间复杂度为O(log(n+m)),果然还是有难度的.话不多说.来看题目. 二.题目 题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))

算法 - 合并两个有序数组成一个有序数组

最近看到一个算法题目,觉得很有意义,就自己查资料,摸索着自己实现了代码,特记录一下. 题目:有两个数组a[]和b[],将它们合并成数组c[],需要c[]也是有序数组. 有两种实现思路: 1. 定义一个新数组,长度为两个数组长度之和,将两个数组都copy到新数组,然后排序. 2. 给两个数组分别定义一个下标,最大长度是数组长度减一,按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标超过数组长度时退出循环,此时较短数组已经全部放入新数组,较长数组还