算法
文章平均质量分 86
算法
KaiPengZhao
共享 共赢
展开
-
算法基础介绍
算法复杂度原创 2022-09-11 00:55:38 · 241 阅读 · 1 评论 -
排序算法介绍
给定数组 arr = [2, 1, 7, 13, 5, 4, 9], 返回升序后的数组?原创 2022-09-11 00:38:21 · 256 阅读 · 0 评论 -
算法技巧/基础汇总
补码 ==> 原码:对于正数,则三码合一;基数为16,由 0 - 9、A、B、C、D、E、F 组成。二进制 十六进制:4位二进制数表示1位十六进制数。二进制 八进制:3位二进制数表示1位八进制数。正数的原码、反码、补码都相同,就是正数的二进制数。原码:直接将一个数值换成二进制数,最高位是符号位。ps:计算/存储使用的是补码,返回结果是原码!反码(负数):排除符号位,对原码按位取反。补码(负数):排除符号位,对反码加1。二进制:基数为2,由 0、1 组成。位运算是针对二进制的运算!............原创 2022-08-28 04:15:10 · 267 阅读 · 1 评论 -
寻找缺失元素 -- 位运算、整型溢出
一般来说,形如(a*b)/c或者(a+b)/c(比如二分查找)的运算,结果就算不溢出,分子也会提前溢出,所以对于这种运算要多思考一下,以免出现隐晦的bug。这样做了之后,就可以发现除了缺失元素之外,所有的索引和元素都组成一对儿了,现在如果把这个落单的索引2找出来,也就找到了缺失的那个元素。假设缺失元素的位置补了一个0,我们让每个索引减去其对应的元素,再把相减的结果加起来,不就是那个缺失的元素吗?类似异或运算,由于加减法满足交换律和结合律,所以总是能把成对儿的数字消去,留下缺失的那个元素的。......转载 2022-07-23 21:48:16 · 120 阅读 · 0 评论 -
装逼指南 -- 位运算
我们刚才说过,两个相同的数异或的结果是0,一个数和0异或的结果是它本身,所以我们把这一组整型全部异或一下,例如这组数据是1,2,3,4,5,1,2,3,4。把(1)中的x带入(2)中的x,有y=x^y=(x^y)^y=x^(y^y)=x^0=x。也就是说,那些出现了两次的数异或之后会变成0,那个出现一次的数,和0异或之后就等于它本身。对于(3),推导如下x=x^y=(x^y)^x=(x^x)^y=0^y=y。.........转载 2022-07-23 21:40:53 · 105 阅读 · 0 评论 -
Two Sum 问题的核心思想 -- HashMap 或者 HashSet
Two Sum 系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的两道,介绍一下这种问题怎么解决。这个问题的最基本形式是这样:给你一个数组和一个整数,可以保证数组中存在两个数的和为,请你返回这两个数的索引。比如输入,算法应该返回数组,因为 3 + 3 = 6。这个问题如何解决呢?首先最简单粗暴的办法当然是穷举了:这个解法非常直接,时间复杂度 O(N^2),空间复杂度 O(1)。更好一点的解法,可以通过一个哈希表减少时间复杂度: 这样,由于哈希表的查询时间为 O(1),算法的时间复杂度降低到转载 2022-07-10 17:22:23 · 91 阅读 · 0 评论 -
双指针技巧汇总
我认为双指针技巧还可以分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。一、快慢指针的常见算法快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slow 在后,巧妙解决一些链表中的问题。1、判定链表中是否含有环这应该属于链表最基本的操作了,如果读者已经知道这个技巧,可以跳过。单链表的特点是每个节点只知道下一个节点,所以一个指针的话无法判断链表中是否含有环的。转载 2022-07-10 17:00:14 · 223 阅读 · 0 评论 -
动态规划介绍
我们刷leetcode的时候,经常会遇到动态规划类型题目。动态规划问题非常非常经典,也很有技巧性,一般大厂都非常喜欢问。今天跟大家一起来学习动态规划的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~什么是动态规划?动态规划的核心思想一个例子走进动态规划动态规划的解题套路leetcode案例分析公众号:捡田螺的小男孩动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的转载 2022-07-09 18:53:09 · 154 阅读 · 0 评论 -
Bitset改进你的程序质量 -- BitMap思路的java实现
BitSet 是用于存储二进制位和对二进制进行操作的 自动去重Java 数据结构,此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 值。用非负的整数将 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 修改另一个 的内容。默认情况下,set 中所有位的初始值都是 。在程序runtime时,我们经常需要使用数组来记住程序的运行状态,并且根据这些状态及时 对数据做出更新,一般有以下处理办法分析可知,1byte=8bit int占用转载 2022-07-09 18:28:55 · 322 阅读 · 0 评论 -
在20亿个随机整数中找出m是否存在,你打算怎么存数据呢?-- BitMap/布隆过滤器
假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存按照惯例,用int存储数据的话,在Java中,int占4字节,1字节=8位(1 byte = 8 bit),一共20亿个int,因而占用的空间约(2000000000*4/1024/1024/1024)≈7.45G很可怕对吧,那如果用Bitmap存呢?只需要0.233G。嘶,这也太强了,为什么这么强呢?到底怎么算的呢?一、基本实现Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即转载 2022-07-09 17:16:56 · 324 阅读 · 0 评论 -
如何判断一个元素在亿级数据中是否存在?-- 布隆过滤器
现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。需求其实很清晰,只是要判断一个数据是否存在即可。但这里有一个比较重要的前提:非常庞大的数据。常规实现先不考虑这个条件,我们脑海中出现的第一种方案是什么?我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较高。写入和判断元素是否存在都有对应的 API,所以实现起来也比较简单。为此我写了一个单测,利用 HashSet 来存数据(底层也是 HashMap );同时为了后面的对比将转载 2022-07-09 16:20:19 · 177 阅读 · 0 评论