删除线性表中的重复元素

来源:互联网 发布:美国经济数据gdp 编辑:程序博客网 时间:2024/05/01 17:11

小记:烦躁ing,看不进去其它东西,就来刷刷leetcode的题目,今天刷到一道比较基础的删除已排序数组的题目,感觉很典型,就记录了一下。

一、leetcode原题:删除已排序数组重复元素

先给出leetcode原题:

Given a sorted array, 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 in place with constant memory.For example,Given input array 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 new length.

原题大意就是对于一个已经排好序的数组,删除重复元素。要求空间复杂度为O(1)。也就是不能重新申请新的数组。

解题思路:对于已经排好序的数组,那么重复元素必然是聚集在一起的,也就是属于前驱后继的关系,所以可以通过比较相邻的元素进行删除。

1.空间换时间的方法(哈希思想)

如果不考虑空间的话,可以申请一个新的数组arrayFlag[n],这个数组的大小n必须要满足大于或者等于给定数组的最大值。这个时候的哈希思想就是:以原数组的的值作为下标,那么这样一个下标就只能对应一个元素,即使哈希一个重复的元素到同一下标,也只能存储一次。

for(int i = 0;i <array.size();i++){       arrayFlag[array[i]] = array[i];}for(int j = 0;j < arrayFlag.size(),j++){        if(arrayFlag[j] != False)              array[newSize++] = arrayFlag[j];}

以上这种方法针对于无序数组也适用,但是缺点是新的生成的数组是不固定的,它是随着原数组的最大元素决定的,所以不是很适合大数据。


2.逆向思维:保存不相同的元素(leetcode上的解决办法)

删除重复的元素,所以对于不相同的元素是需要存储保留起来的,那么我们可以设置一个变量就是存储数组中不同元素的个数。具体的算法如下:

class Solution {public:    int removeDuplicates(vector<int>& nums) {        int newSize = 1;        if(nums.size() <= 1)            return nums.size();        for(int i = 1;i < nums.size();i++){            if(nums[i] != nums[i-1]){                nums[newSize] = nums[i];                newSize++;                }            }        return newSize;    }};

以上算法的优点在于时间和空间复杂度都是目前最低的情况了。用一个变量newSize来存储不同的元素个数,如果前后两个元素不同,那么就保存不同的元素。需要注意的是如果只有一个元素或者为空数组,那么就返回数组原来的大小即可。还需要注意的是newSize的初始值是1,如果是0的话,那么就会在只有两个相同元素的数组总出现错误。

当然,这种思想也可以用在删除某个给定的数组元素,保留不等于给定元素的的其它元素,然后就可以在O(n)的时间复杂度内实现删除某个给定的元素了。(leetcode中的另外 一题)


二、拓展:删除线性表中的重复元素

1.删除无序数组中的重复元素

之前在一中提到的第一种方法也是可以针对无序数组的情况,第二种方法在针对无序数组之前,可以先调用其它一些排序算法对其进行排序。

2.删除无序链表中的重复元素

线性表中除了数组,还有链表,针对链表的删除重复元素,可以采用最能想到的算法:就是重新构造一个链表。先遍历,从第一个元素开始依次将所有的元素都与其它元素进行比较,就可以得到一个新的没有重复元素的链表,这种情况下的时间复杂度会是O(N^2).


以上就是刷到这题之后的一个想法,欢迎补充。

0 0
原创粉丝点击