小试牛刀
- 异或:^
- 无进位相加
- 满足结合律、交换律
- O^N=N;N^N=0
- ab交换
//不借助第三方变量;
//!必须保证ab不是同一内存
a = a^b;
b = a^b;
a = a^b;
找数组出现奇数次的数
int[] a = {xx,x,x,x,x,x,x};
int eor = 0;
for(ina q:a){
eor ^= q;
}
//eor即为奇数次的数值
归并排序的扩展
数组中小和问题
int xioaSum = 0;
int[] a = {1,3,4,2,5};
//数a[i]左边比它小的数的和,爆破O(n^2)
//优:数a[i]右边比他大的数的次数c;c*a[i] 依次求和。O(nlogn)
逆序对问题
int[] = {3,2,4,5,0};
//逆序对:a[i]右边比它小的数组成的
快排前夕
//a(快排1.0).将数组小于等于最后一个数的元素放在左边,大于的元素放在右边。
荷兰国旗问题
int[] a = {5,2,3,7,8,1,4};
//b(快排2.0).将数组小于某数(取最后一个数)的元素放在左边,等于某数的元素放在中间,大于的元素放在右边。
//要求时间O(n),空间O(1)
//c(快排3.0).将数组小于某数(随机获取)的元素放在左边,等于某数的元素放在中间,大于的元素放在右边。
//综合时间O(nlogn),荷兰国旗不要求排序,1.0 2.0 可能取得有序数组的边直导致时间为O(n^2)
堆结构和堆排序
- 优先级队列就是堆,堆是完全二叉树
- PriorityQueue
默认是小根堆 - 节点:
- 父节点:(i-1)/2
- 子节点:2i+1、2i-1
- heapInsert()插入,从下往上与父节点比较
- heapofy()调整,从上往下与子节点大的节点比较
有序表
- 回文判断 ```java //T:给定单链表头节点head,判断是否回文 //Ex:1->2->1 true; 1-2-2-1 true
//A:放入栈,取出与原表遍历比较。 //A:优空间,后一半入栈,与原前半比较
//快慢指针FS;F:一次走两步;S:一次走一步。分析奇偶情况。 ```