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

给定一个排序数组,需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度

数组nums=[0,0,1,1,1,2,2,3,3,4]

函数应该返回新的长度为5,并且原数组nums的前五个元素被修改为0,1,2,3,4。不要使用额外的数组空间,必须在原地修改输入数据并在O(1)额外空间的条件下完成

分析:

对于问题。如果不要求空间和时间要求的话,还是很easy的。但是要求O(1)的时间。因此必须得另外想办法解决。这个的前提是有序数组,因此一样的数字都是排列在一起的。这里可以用到两个指针位,一个是慢指针,一个是快指针。快指针在慢指针之前,当遇到重复的数字的时候,快指针一直往前移动,当遇到和慢指针不相同的数字的时候,慢指针移动,并用快指针的值来替代此时慢指针的值。最终slow指针之前的值都是不重复的,之后的都是重复的值。

如下示例:s代表慢指针,F快指针

0      0      1      1      1      2      2      3      3      4

S      F

1 num[s] == num[f]. F指针向前移动

0      0      1      1      1      2      2      3      3      4

S              F

2 num[s] != num[f]. S指针向前移动,并且num[s]=num[f]. F指针继续向前移动

0      1      1      1      1      2      2      3      3      4

  S              F

3 num[s] == num[f]. F指针向前移动

0      1      1      1      1      2      2      3      3      4

  S                      F

4 num[s] == num[f]. F指针向前移动

0      1      1      1      1      2      2      3      3      4

  S                              F

5 num[s] != num[f]. S指针向前移动,并且num[s]=num[f]. F指针继续向前移动

0      1      2      1      1      2      2      3      3      4

    S                              F

6 num[s] == num[f]. F指针向前移动

0      1      2      1      1      2      2      3      3      4

    S                                      F

7 num[s] != num[f]. S指针向前移动,并且num[s]=num[f]. F指针继续向前移动

0      1      2      3      1      2      2      3      3      4

        S                                      F

8 num[s] == num[f]. F指针向前移动

0      1      2      3      1      2      2      3      3      4

        S                                              F

9 num[s] != num[f]. S指针向前移动,并且num[s]=num[f]. F指针继续向前移动

此时s指针之前的数组就是不重复的数组

0      1      2      3      4      2      2      3      3      4

         S

代码如下:

int removeDuplicates(int num[], int len)
{
    int slow, fast;
    slow = 0;
    fast = 1;
    while (fast < len)
    {
        if (num[fast] != num[slow])
        {
            slow++;
            num[slow] = num[fast];
        }
        fast++;
    }
    return slow+1;
}

原文地址:https://www.cnblogs.com/zhanghongfeng/p/11771758.html

时间: 2024-10-18 09:49:27

如何高效的对有序数组去重的相关文章

有序数组去重的几种算法

最差的算法: 最差的算法: 去重,与数组是否有序无关 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

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

问题描述 给出一个有序数组,就地移除重复元素,保持每个元素只出现一次,并返回新数组的长度. 问题分析 这个比较简单,直接使用两个指针,一个在前,一个在后,扫描一遍数组即可.时间复杂度为O(n^2). 比如数组A = { 1,1, 2, 3, 3 },看下图,思想简单明了. 代码实现 #include <iostream> using namespace std; //去除数组中重复的数字,返回新数组的长度 int RemoveDuplicate( int nArray[], int nCoun

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

使用JavaScript进行数组去重——一种高效的算法

最近比较忙,没时间更新博客,等忙完这阵子会整理一篇使用AngularJS构建一个中型的单页面应用(SPA)的文章,尽情期待!先占个坑. 数组去重的算法有很多种,以下是一种. 思路如下: 定义一个空的对象obj: 循环数组arr,判断obj[arr[i]]是否为false,如果是则将该数组元素放到result中,并且将obj[arr[i]]置为true: obj[arr[0]]肯定为false,因为obj为空,arr[0]将被放到result中,并且obj[arr[0]]被置为true: 循环的过

高效合并两个有序数组(Merge Sorted Array)

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.The number of elements initi

混合两个有序int数组到另一个有序数组并去重

题目:两个有序数组a和b,混合之,放在另一个数组c中,使得c也是有序数组(升序),去除重复的项. 虽然觉得不是很简便,但代码如下: int merge_array (int *a , int *b, int *c, int n1, int n2) { if (n1 < 0 || n2 < 0) { return -1; } int i = 0; int j = 0; int k = 0; int count = 0; while (i < n1 && j < n2)

前端实现数组去重,如何高效快捷?

数组去重 1.双循环去重 双重for(或while)循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组:因为它的时间复杂度是O(n^2),如果数组长度很大,那么将会非常耗费内存. function unique(arr) { if (!Array.isArray(arr)) { console.log('type error!') return } le