算法的小常识

1.int类型都是二进制32位的,第32位是符号位,第32位为0就是非负数,1就是负数
2.负数是除了符号位,其他位数取反+1 ,-1为32个1
3.~ 取反符号
4.取反+1就是一个数的相反数
5.Integer最小值的取反也是自己
6.0取反还是0
7.ArrayList在时间复杂度的层面讲,与数组的时间复杂度是一样的,都是O(1)
8.冒泡排序的时间复杂度是O(n2)
9.二分法的时间复杂度是O(log2N)
10.TreeMap的时间复杂度为O(log2n),HashMap时间复杂度为O(1)
11.1kb = 1024byte
1byte = 8 bits
一个int是4个字节(byte)32个bits(位)一个long类型是64bits
一个字母是1个字节,一个汉字是两个字节
12.右移多少位就是数以2的多少次方,左移多少位就是乘以多少次方
13.一个长度为1 的int[]数组可以表示32个数有没有出现过,一个长度为1的long[]可以表示64个数有没有出现过
14.一个一个数%2的倍数,就是将这个数&这个数-1
15.位运算的速度比加减乘除快10倍多
16.|= 解释:左边与右边按位或后,再赋值给左边
17.^异或,同为0,异为1,异或就是无进位相加的结果
18.a&b再<<1就是a和b的进位的数
19.a+b = a^b + (a&b)<<1 位运算的加法
20.>>带符号右移,左边用符号位补
21.^可以用!=代替
22.String比较用字典序:
1.相同长度,根据第一个字符的ASCILL码的大小比较大小
2.不同长度,将长度小的用ASCLL最小的字符补齐再比较

二叉树

1.先序:头左右
2.中序:左头右
3.后序:左右头

Queue

1.先进先出

时间复杂度

当时间复杂度会根据数据的不同产生不同的时间复杂度,以最不理想的状态来去决定时间复杂度

额外空间复杂度

在实现算法流程的过程中,你需要开辟一些空间来支持你的算法流程
作为输入参数的空间,不算额外空间
作为输出的结果的空间,也不算额外的空间
除此之外流程还需要开辟空间,就是额外的空间复杂度

最优解

1.时间复杂度
2.空间复杂度
常数时间不用管

异或

1.异或就是无进位加法
2.N^N = 0
3.异或可以解决的问题:1.一组数中有一种数出现了奇数次,其他数都出现了偶数次
解析:创建一个变量,将这个变量与这组数的每一个数进行异或,结果就是这个奇数
2.把int类型的数提取最右侧的1来
解析:这个数&这个数的相反数

master公式

只满足于子规模一致的递归
时间复杂度T(N) = a * T(N/b) + O(N^d)
1.log(b,a) < d T(N) = O(N^d)
2.log(b,a) > d T(N) = O(N^log(b,a))
3.log(b,a) == d T(N) = O(N^d * log(2,N))

哈希表

1)使用哈希表增(put)、删(remove)、改(put)和查(get)的操作,可以认为时间复杂度为 O(1),但是常数时间比较大
2)放入哈希表的东西,如果是基础类型,内部按值传递,内存占用是这个东西的大小
3)放入哈希表的东西,如果不是基础类型,内部按引用传递,内存占用是8字节

栈:数据先进后出,犹如弹匣 队列:数据先进先出,好似排队

比较器

即如下方法:
@Override
public int compare(T o1, T o2) ;
返回负数的情况,就是o1比o2优先的情况
返回正数的情况,就是o2比o1优先的情况
返回0的情况,就是o1与o2同样优先的情况

堆结构

1)堆结构就是用数组实现的完全二叉树结构
2)完全二叉树中如果每棵子树的最大值都在顶部就是大根堆
3)完全二叉树中如果每棵子树的最小值都在顶部就是小根堆
4)堆结构的heapInsert与heapify操作
heapInsert就是调整某一位置的数上移,保持堆的规律的方法
heapify就是某一位置的数下沉,保持堆的规律的方法

堆排序

1.先让整个数组都变成大根堆结构,建立堆的过程:
1)从上到下的方法,时间复杂度为O(NlogN)
2)从下到上的方法,时间复杂度为O(N)
2.把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调整堆,一直周而复始,时间复杂度为O(N
logN)
3.堆的大小减小成0之后,排序完成

Hash表

hash表在忽略每一个样本大小的时候,增删改查的时间复杂度是O(1)的
因为在hash表进行计算hash值是对样本进行遍历的

排序天花板

1.没有条件限制的排序的时间复杂度最快O(N*logN)
2.特殊条件限制的排序的时间复杂度最快O(N)

Java算法题,所有例子的条数在10的8次方到10的9次方之间才能通过,超过超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值