力扣刷题:删除重复元素

这篇具有很好参考价值的文章主要介绍了力扣刷题:删除重复元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

当处理排序数组时,删除重复元素是一个常见的问题。首先,我们来看一下如何解决这个问题,然后再进一步讨论如何处理允许最多重复两次的情况。

删除重复元素

问题描述:给定一个已排序的数组,删除重复的元素,使得每个元素只出现一次,并返回新的长度。

解决思路:

使用双指针方法。一个指针用于遍历数组,另一个指针指向当前不重复元素应该存放的位置。
通过比较当前元素与前一个元素是否相等,确定是否需要移动元素。

方法:

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

删除重复元素(允许最多重复两次)

问题描述:给定一个已排序的数组,删除重复的元素,使得每个元素最多只出现两次,并返回新的长度。

解决思路:

仍然使用双指针方法,但需要进行一些额外的判断。
使用一个计数器来记录当前元素的重复次数,控制重复次数不超过两次。由于代码本身已经排序,所以只需要使用一个计数器,否则需要使用哈希表

解决方法:

int removeDuplicates(vector<int>& nums) {
    if (nums.size() <= 2)
        return nums.size();
    
    int index = 2;
    int count = 1;
    for (int i = 2; i < nums.size(); i++) {
        if (nums[i] != nums[index - 1]) {
            nums[index] = nums[i];
            index++;
            count = 1;
        } else if (count < 2) {
            nums[index] = nums[i];
            index++;
            count++;
        }
    }
    
    return index;
}

如果数组无序

如果数组不是有序的,并且要求删除重复元素的同时保持原来的顺序,可以使用哈希表来解决这个问题。

重复一次

下面是解决办法的详细步骤:

初始化一个空的哈希表来记录已经出现过的元素。
初始化一个新的数组result,用于存放不重复的元素。
遍历原始数组,对于每个元素:
如果该元素不在哈希表中,表示遇到了一个新的不重复元素。将其添加到哈希表中,并将其添加到result数组末尾。
如果该元素已经在哈希表中,表示遇到了重复元素,直接跳过该元素。
返回result数组的长度作为结果。
以下是使用C++实现的代码示例:

#include <iostream>
#include <vector>
#include <unordered_set>

int removeDuplicates(std::vector<int>& nums) {
    std::unordered_set<int> seen;
    std::vector<int> result;
    
    for (int num : nums) {
        if (seen.find(num) == seen.end()) {
            seen.insert(num);
            result.push_back(num);
        }
    }
    
    nums = result;  // 更新原数组为不重复的结果数组
    
    return result.size();
}

int main() {
    std::vector<int> nums = {3, 1, 2, 1, 3, 2, 4};
    
    int length = removeDuplicates(nums);
    
    std::cout << "Length: " << length << std::endl;
    std::cout << "New Array: ";
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

通过调用removeDuplicates函数,可以得到去除重复元素后的新数组长度。原数组nums会被更新为只包含不重复元素的结果数组。代码中使用了unordered_set来记录已经出现过的元素,保证了查找的时间复杂度为O(1)。

重复两次

可以使用unordered_map来记录每个元素的出现次数,以实现删除重复元素并保持原始顺序的要求。
下面是使用unordered_map解决问题的思路和代码:
初始化一个空的unordered_map,用于记录每个元素的出现次数。
初始化一个新的数组result,用于存放不重复的元素。
遍历原始数组,对于每个元素:
如果该元素不在unordered_map中,表示遇到了一个新的元素。将其添加到unordered_map中,并将其添加到result数组末尾。
如果该元素已经在unordered_map中,表示遇到了重复元素。检查该元素的出现次数:
如果出现次数小于2,将其添加到unordered_map中,并将其添加到result数组末尾。
如果出现次数大于等于2,直接跳过该元素。
返回result数组的长度作为结果。
以下是使用C++实现的代码示例:

#include <iostream>
#include <vector>
#include <unordered_map>

int removeDuplicates(std::vector<int>& nums) {
    std::unordered_map<int, int> counts;
    std::vector<int> result;
    
    for (int num : nums) {
        if (counts.find(num) == counts.end()) {
            counts[num] = 1;
            result.push_back(num);
        } else {
            if (counts[num] < 2) {
                counts[num]++;
                result.push_back(num);
            }
        }
    }
    
    nums = result;  // 更新原数组为不重复的结果数组
    
    return result.size();
}

int main() {
    std::vector<int> nums = {3, 1, 2, 1, 3, 2, 4};
    
    int length = removeDuplicates(nums);
    
    std::cout << "Length: " << length << std::endl;
    std::cout << "New Array: ";
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

通过调用removeDuplicates函数,可以得到去除重复元素后的新数组长度。原数组nums会被更新为只包含不重复元素的结果数组。在代码中,使用unordered_map来记录每个元素的出现次数,并根据出现次数的大小判断是否添加到结果数组中。

总结

以上是使用C++实现的解决方案。这两个问题都可以通过这些代码解决,并且时间复杂度为O(n),其中n是数组的长度。
希望这篇博文对初学者有所帮助,并能够清晰地解释了解决这两个问题的思路和方法。文章来源地址https://www.toymoban.com/news/detail-540450.html

到了这里,关于力扣刷题:删除重复元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣(LeetCode)算法_C++——存在重复元素 II

    存在重复元素 II 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) = k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3 输出:true 示例 2: 输入:nums = [1,0,1,1], k = 1 输出:true 示例

    2024年02月09日
    浏览(36)
  • 【leetcode 力扣刷题】汇总区间//合并区间//插入区间

    题目链接:228.汇总区间 题目内容: 看题目真是没懂这个题到底是要干啥……实际上题目要求的 恰好覆盖数组中所有数字 的 最小有序 区间范围列表,这个最小是指一个区间范围小。比如能够覆盖{2,3,4,6}的区间可以是[2,6],但是5在区间内,却不在数组内,因此这个区间不是最

    2024年02月10日
    浏览(38)
  • leetcode 力扣刷题 旋转矩阵(循环过程边界控制)

    下面的题目的主要考察点都是,二维数组从左上角开始顺时针(或者逆时针)按圈遍历数组的过程。顺时针按圈遍历的过程如下: 对于每一圈,分为四条边 ,循环遍历就好。这时,对于 四个角 的元素的处理,可以将四条边的遍历分为以下两种情况: 第一种:每条边都从对

    2024年02月12日
    浏览(48)
  • 【leetcode 力扣刷题】链表基础知识 基础操作

    在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】是线性结构的,其中线性表包括顺序表和链表。数组就是顺序表,其各个元素在内存中是连续存储的。 链表则是由 数据域 和 指针域 组成的 结构体 构成的,数据域是一个节点的数据,指针域

    2024年02月12日
    浏览(39)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(48)
  • 【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

    题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须 原地修改 输入数组,即不能新建一个数组来完成字符串的反转。我们注意到: 原来下标为0的,反转后是size - 1【原来下标是size - 1的,反转后是0】; 原来下标是1的,反转后是size - 2【原来下标是size -2的,反转后

    2024年02月11日
    浏览(46)
  • 【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

    以下是能用KMP求解的算法题,KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 题目链接:28. 找出字符串中第一个匹配项的下标 题目内容: 题意还是很好理解的,要在字符串haystack中查找一个完整的needle,即字符串匹配。 暴力求解就是用 两层循环 :haystack从第

    2024年02月09日
    浏览(42)
  • 算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

    给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 链表中节点数目在范围 [0, 300] 内 -100 = Node.val = 100 题目数据保证链表已经按升序 排列 面对这道算法题目,二当家的再次陷入了沉思。 本来要删除重复元素,需要两次遍

    2024年02月07日
    浏览(42)
  • 算法leetcode|82. 删除排序链表中的重复元素 II(rust重拳出击)

    给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 链表中节点数目在范围 [0, 300] 内 -100 = Node.val = 100 题目数据保证链表已经按升序 排列 面对这道算法题目,二当家的再次陷入了沉思。 这道题目和 83. 删除排序

    2024年02月08日
    浏览(38)
  • 力扣刷题-动态规划算法3:完全背包问题

    问题描述: 1)有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 2) 每件物品都有无限个(也就是可以放入背包多次) (比0-1背包多出的条件) 3) 求解将哪些物品装入背包里物品价值总和最大。 求解步骤: 1)首先遍历物品,然

    2023年04月13日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包