美文网首页LeetCode
002-已排序数组中存在特定个数的重复元素

002-已排序数组中存在特定个数的重复元素

作者: Woodlouse | 来源:发表于2020-05-07 21:50 被阅读0次

描述

第一节题目的基础上,加入一个条件:最多允许存在两个重复元素,应该怎么做呢?

输入

[1, 1, 1, 2, 3, 3, 3, 3]

输出

5

分析

在第一题分析的基础上,最直观的思路是,引入一个变量(repeatCnt)记录重复元素的个数
1,当检查的元素i和当前位置的index的值相等时,若:
1)repeatCnt小于2时,向前移动index
2)若repeatCnt大于等于2时,保持index位置不变
2,当检查的元素i和当前位置的index的值不相等时,操作和上一节相同

综上分析,在第一节的基础上写出如下代码:

int duplicatesAtMostTwice00(int A[], int n)
    {
        if (n<=2) {
            return 2;
        }
        
        int index = 0;
        int repeat = 1;
        for (int i=1; i<n; i++) {
            if (A[i] != A[index]) {
                A[++index] = A[i];
                repeat = 1;
            }
            else {
                if(repeat < 2) {
                    ++repeat;
                    ++index;
                }
            }
        }
        
        return index+1;
    }

进一步的分析

上一种做法,优点是简单易懂,缺点时代码比较冗余,我们再做进一步的思考。

在一个有重复元素的排序数组中允许存在repeatCnt个数的重复元素,则:

1,数组的前repeatCnt个元素一定是可以存在的;

2,数组中待排查元素的起始位置(i)为repeatCnt的值,i = repeatCnt;

3,数组的后续可放置元素的位置(index)为repeatCntindex = repeatCnt;

判断元素是否可以存在的逻辑

当前检测的位置i的元素和位置indexrepeatCnt个元素不同,则可以放置到index位置上,index前移一个位置。

伪代码标识如下:

if a[i] != a[index-repeatCnt]:
    a[index++] = a[i]

依据分析,进一步的代码如下:

int duplicatesAtMostTwice01(int A[], int n)
{
    int duplicateCnt = 2;
    if (n<=duplicateCnt) {
        return n;
    }
    
    int index = duplicateCnt;
    for (int i=duplicateCnt; i<n; i++) {
        if (A[i] != A[index-duplicateCnt]) {
            A[index++] = A[i];
        }
    }
    
    return index;
}

总结

在有序数组中进行原地操作时,需要:

1,确定数组的起始结尾游标;

2,确定检查元素的起始游标;

3,设计逻辑判断条件,移动游标操作数组元素的移动;


代码在这儿

相关文章

  • 002-已排序数组中存在特定个数的重复元素

    描述 在第一节题目的基础上,加入一个条件:最多允许存在两个重复元素,应该怎么做呢? 输入 [1, 1, 1, 2,...

  • 数组去重, 返回包含删除数据的函数

    思路: 数组排序sort(), 找到重复的数据, 并保存在一个新的数组(若数组中没此元素)中

  • 三行代码,去掉两个数组的重复元素及排序

    如题:三行代码,去掉两个数组的重复元素及排序

  • 去除已排序数组中的重复元素

    题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度。 要求 不要给数...

  • IOS 算法(基础篇) ----- 找出 3 位偶数

    给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。你需要找出 所有 ...

  • 归并两个已排序数组

    已知两个已排序数组,将这两个数组合并为一个排序数组。设a[i]对应数组1的元素,b[j]对应数组2的元素,则a[i...

  • leetcode 初级算法 数组(C++)

    初级算法 数组 1.从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一...

  • js实现数组去重

    定义一个新数组,判断旧数组中的元素是否在新数组中已存在 对数组进行排序后,比较前后两个相邻元素 根据对象的属性不重...

  • 2018-07-08

    数组 问题1. 从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,...

  • 数组

    1. 去除数组中的重复元素 题目 已知一个已经排序的数组,去除数组中的重复元素,返回数组的长度。 思路 使用双指针...

网友评论

    本文标题:002-已排序数组中存在特定个数的重复元素

    本文链接:https://www.haomeiwen.com/subject/ckzzghtx.html