一、学习借鉴
引:上一篇文章中在合并俩数组时用到了好几个for循环,因此大大增加了时间复杂度,于是找了好多关于这方面的算法。
请看下面事例:
整个过程中用到的原理都在注释中。
public static void find(){ int[] arr1={1,3,5}; int[] arr2={2,4,6}; /* * [1 3 5] [2 4 6]-----0 1 2(索引) * 0 1 2 0 1 2 * m=3 n=3 * arr1[0]<arr2[0]----成立---arr[]=[1,0,0,0,0,0] i++=1 * arr1[1]<arr2[0]---不成立--arr[]=[1,2,0,0,0,0] j++=1 * arr1[1]<arr2[1]---成立----arr[]=[1,2,3,0,0,0] i++=2 * arr1[2]<arr2[1]---不成立--arr[]=[1,2,3,4,0,0] j++=2 * arr1[2]<arr2[2]---成立----arr[]=[1,2,3,4,5,0] i++=3=m--结束while * */ int m=arr1.length; int n=arr2.length; int N=m+n; int[] arr=new int[N];//创建新数组--存合并后的数 int i=0,j=0,k=0; while (i<m&&j<n){ if (arr1[i]<arr2[j]){//如果从0开始,arr1中的数小于arr2中的数,则将数存在arr中 arr[k++]=arr1[i++]; }else{ arr[k++]=arr2[j++]; } } /* * 继续判断 因为i或者j某一个超过m或者n就退出了while但是数组元素并没有全部存在arr中 * i=3不再继续 j=2<n=3继续 */ while (i<m) arr[k++]=arr1[i++]; while (j<n) arr[k++]=arr2[j++]; System.out.println(Arrays.toString(arr));
结果:
[1, 2, 3, 4, 5, 6]
二、第一篇文章算法优化(java内部自带函数)
Arrays.sort(nums);//对数组自动从小到大排序,因此避免了排序算法带来的过高时间复杂度
等价代码:
for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[i] >= nums[j]) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } }
很明显嵌套for循环时间复杂度更大