线性时间从小到大打印数组
问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。
对于这道题,如果你是先把这 n 个数先排序,再打印,是不可能O(n)的时间打印出来的。但是数值范围在 0-20。我们就可以巧用数组下标了。把对应的数值作为数组下标,如果这个数出现过,则对应的数组加1。最后只要遍历这个数组,如果数组元素不为零就打印该数组下标即可。
public void dfs(int[] arr){
int[] temp = new int[21] ;
for(int i = 0 ; i < temp.length ; i ++ ){
temp[arr[i]]++ ;
}
for(int i = 0 ; i < 21 ; i ++){
for(int j = 0 ; j < temp[i] ; j++ ){
system.out.print(i) ;
}
}
}
巧用数组下标
数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些字母作为下标,在遍历的时候,如果字母a遍历到,则arr[a]就可以加1了,即 arr[a]++;
通过这种巧用下标的方法,我们不需要逐个字母去判断。