算法通关村第11关【黄金】| 用4KB内存寻找重复元素

这篇具有很好参考价值的文章主要介绍了算法通关村第11关【黄金】| 用4KB内存寻找重复元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目要求:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。

思路:

直接用大小为32000的int数组来标记对应下标下的值出现次数,但是空间大小是32000*4B超过了4KB

这里采用一种压缩空间的方式——位图,每一位表示对应的一个整数,用32000位就能代表32000个整数,直接每个元素节省了一个int大小也就是4B的空间。

初始化数组时:this.bitset = new int[size >> 5]  => 每32缩小一个int大小

set时:先获取pos除以32的整数部分,再获取pos除以32的余数

例如34,先34>>5等于1,再34&(11111)等于2(00010),对应bitset[1]中的第2位

bitset[0]对应1-32

bitset[1]对应33-64

这样就能每一个bitset用32位表示32个int文章来源地址https://www.toymoban.com/news/detail-703448.html

public class FindDuplicatesIn32000 {
    public void checkDuplicates(int[] array) {
        BitSet bs = new BitSet(32000);
        for (int i = 0; i < array.length; i++) {
            int num = array[i];
            int num0 = num - 1;
            if (bs.get(num0)) {
                System.out.println(num);
            } else {
                bs.set(num0);
            }
        }
    }

    class BitSet {
        int[] bitset;

        public BitSet(int size) {
            this.bitset = new int[size >> 5];
        }

        boolean get(int pos) {
            int wordNumber = (pos >> 5);
            int bitNumber = (pos & 0x1F);
            return (bitset[wordNumber] & (1 << bitNumber)) != 0;
        }

        void set(int pos) {
            int wordNumber = (pos >> 5);
            int bitNumber = (pos & 0x1F);
            bitset[wordNumber] |= 1 << bitNumber;
        }
    }
}

到了这里,关于算法通关村第11关【黄金】| 用4KB内存寻找重复元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 算法通关村第十六关:黄金挑战:滑动窗口与堆结合

    堆的大小一般是有限的,能直接返回当前位置下的最大值或者最小值 该特征与滑动窗口结合,可以解决一些特定场景的问题 1. 滑动窗口与堆问题的结合 LeetCode239 https://leetcode.cn/problems/sliding-window-maximum/ 思路分析 对于最大值,K个最大这种场景,优先队列(堆)是首先该考虑的

    2024年02月09日
    浏览(39)
  • [Go版]算法通关村第十二关黄金——字符串冲刺题

    题目链接:LeetCode-14. 最长公共前缀 以第一个子字符串为标准,遍历其每个字符时,内嵌遍历其余子字符串的对应字符是否一致。不一致时,则返回当前字符之前的子字符串。 复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O ( n ∗ m ) 、空间复杂度 O ( 1 ) O(1) O ( 1 ) 时间复杂度:其中 n

    2024年02月12日
    浏览(38)
  • [Go版]算法通关村第十五关黄金——继续研究超大规模数据场景的问题

    在 海量数据 中,此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路: 使用位存储 ,使用

    2024年02月10日
    浏览(40)
  • 算法通关村第一关------链表经典问题之寻找第一个公共子结点

    哈希和集合 栈 拼接两个字符串 同步相消 1、哈希和集合法:         将一个链表存入Map(或者集合)中,然后遍历第二个链表,在遍历的同时,检查在Hash(或者集合)中是否包含此节点。  2、栈方法:         主要思想:栈是后进先出原则,stack.peek()方法每次比较栈顶

    2024年02月12日
    浏览(36)
  • [Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

    题目链接:LeetCode-1979. 找出数组的最大公约数 辗转相除法其核心部分为:若r 是a ÷ b的余数,则 gcd(a, b)=gcd(b, r) 题目链接:LeetCode-204. 计数质数 如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数。 时间复杂度分析: 外层循环的迭代次数是 n-2,即 O ( n ) O(n) O ( n ) 次

    2024年02月11日
    浏览(38)
  • 算法通关村第十五关——从10亿数字中寻找最小的100万个数字

    本题有三种常用的方法,一种是先排序所有元素,然后取出前100万个数,该方法的时间复杂度为O(nlogn)。很明显对于10亿级别的数据,这么做时间和空间代价太高。 第二种方式是采用选择排序的方式,首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小

    2024年02月11日
    浏览(43)
  • 算法通关村第一关——链表经典问题之寻找两个链表的第一个公共结点

    这是一道经典的链表问题,来自剑指offer52,题目是这样的:输入两个链表,找出它们的第一个公共结点,如下图所示: 两个链表的头结点均已知,相交之后成为一个单链表,但是相交的位置未知,并且相交之前的结点数也是未知的,请设计算法找到两个链表的合并点。 第一

    2024年02月16日
    浏览(54)
  • 算法通关村——删除元素专题

    LeetCode27.给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用  O(1)  额外空间并  原地 修改输入数组 。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例

    2024年02月13日
    浏览(37)
  • java数据结构与算法刷题-----LeetCode287. 寻找重复数

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 弗洛伊德判圈法,也就是快慢指针判圈法(龟兔赛跑算法),此算法分为两个步骤 判断是否有环,并得到快慢指针相遇

    2024年01月24日
    浏览(38)
  • 算法通关村第十四关——解析堆在数组中找第K大的元素的应用

    力扣215题 , 给定整数数组nums和整数k,请返回数组中第k个最大的元素。 请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 分析 :按照“找最大用小堆,找最小用大堆,找中间用两个堆”,这道题用最小堆来解决,构造一个大小只有K的最小堆

    2024年02月07日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包