leetcode算法(一)时间复杂度
1.时间复杂度:忽略所有常数项,取最高次。
eg: aN2+bN +c
时间复杂度为O(n2)
2.评价一个算法的好坏:
先看时间复杂度,然后在分析不同数据样本下的实际运行时间,也就是“常数项时间”
3.交换另一种写法
#在数组中当i!=j的时候可以这样,必须要i j指向不同的内存空间
swap(arr, i , j):
arr[i] = arr[i] ^ arr[j]
arr[j] = arr[i] ^ arr[j]
arr[i] = arr[i] ^ arr[j]
4. 递归master公式
T(N) = a*T(N/b) + O(N^d)
1)logba < d — O(Nd)
2)logba < d — O(Nlog~b~a)
3)logba < d — O(Nd*logN)
5.归并排序(小和问题)
小和问题:在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和。 求一个数组的小和。
package mergeSort;
public class smallSum {
public static int samllSum(int[] arr) {
if (arr == null||arr.length<2) {
return 0 ;
}
return mergeSort(arr,0,arr.length-1);
}
public static int mergeSort(int[] arr,int L,int R) {
if (L == R) {
return 0;
}
int m=L+((R-L)>>1);
return mergeSort(arr,L,m)+
mergeSort(arr,m+1,R)+
merge(arr, L,m,R);
}
public static int merge(int[] arr, int l, int m,int r) {
//help用来存放临时数据
int[] help=new int[r-l+1];
int count=0;
int index1=l;
int index2=m+1;
int i=0;
while (index1<=m&&index2<=r) {
count+=(arr[index1]<arr[index2])?
(arr[index1])*(r-index2+1):0;
help[i++]=(arr[index1]<arr[index2])
?arr[index1++]:arr[index2++];
}
while (index1<=m) {
help[i++]=arr[index1++];
}
while (index2<=r) {
help[i++]=arr[index2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
return count;
}
public static void main(String[] args) {
int[] a= {1,3,4,2,5};
System.out.println(samllSum(a));
}
}
6.快速排序(荷兰国旗问题)
**荷兰国旗问题:**无需列表,分成3个部分,小于i,等于i,大于i
快排1.0: 总拿最后一个数做分部,不停递归 O(N2)
快排2.0: 增加了一个=区域 O(N2)
快排3.0: 随机选择一个数做划分 O(N*log2N)