认识复杂度和简单排序算法
异或 无进位加法
题目:在一组数中,有两种数出现奇数次,其他数出现偶数次,分别求出这两种数
int eor = 0;
for(int i= 0;i<arr.length;i++)
{
eor^=arr.[i];
}
// eor = a^b;
//eor !=0;
// eor必然有一个位置上是1
int rightOne = eor &(~eor +1) //提取出最右的1
int onlyOne = 0; //eor'
for(int cur :arr)
{
if((cur &rightOne)==1/*或者0*/){
onlyOne ^=cur;
}
}
println(onlyOne + " "+(eor ^onlyOne));
位运算比算术运算快
题目三:插入排序
从右往左排 插入
数据状况不同会导致时间复杂度不同
时间复杂度按照最差情况估计
最坏情况
7 6 5 4 3 2 1
时间复杂度 O(N^2)
复杂度 还有平均复杂度 最好复杂度
void insertionSort {
if (arr == null|| arr.length <2){
return;
}
}
void insertionSort {
if (arr == null|| arr.length <2){
return;
}
//0~0 有序的
//0~i 想有序
for (int i =1;i<arr.length;i++){//0~i 做到有序
for (int j= i-1;j>= 0 &&arr[j]>arr[j+1];j--)
{
swap(arr,j,j+1);
}
}
}
二分法
(1)在一个有序数组中,找某个数是否存在;
一次砍一半 时间复杂度O( log2 N) 默认以2为底 O( log N)
16 8 4 2
(2)在一个有序数组中,找>= 某个数最左侧的位置
(3)局部最小值问题
arr 中,无序,相邻数一定不相等
局部最小 i<i+ 1 i<i-1 i 为局部最小 要求时间复杂度 < O(n)
算法流程优化方向
1,数据状况
2,问题
对数器的概念和使用
方法 a 想测的
方法 b
随机样本产生器
递归方法
master 公式