Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
问题描述
在排好序的数组中查找某个数,如果找到返回所在的位置,不存在返回-1
解题思路
对于排好序的数组,我们没必要从头找到尾,因为从头找到尾的平均时间复杂度为O(N/2)。
可以将数组从中间一分为2,如果走运,中间的数值正好等于要找的数,那就结束。如果发现中间这个数大于我们要找的数,那右半边的数,我们就没必要去比较了,可以扔掉不管。我们再将左边的数从中间拆开,和要找的数比较,这样每做一次比较,就扔掉一半的数据,显然这种方法大大地减少了比较次数,运气最差时,经过log2N次比较,就能够确定数的位置。
使用递归的代码
public class HalfSearch {
public static void main(String[] args){
int[] arr = {1,4,6,8,9,10,22,29};
int n=30;
HalfSearch halfSearch = new HalfSearch();
int position = halfSearch.getPosition(arr,n,0,arr.length-1);
System.out.println(position);
}
public int getPosition(int[] arr,int n,int start,int end){
if(end<start){
return -1;
}
int position =(start+end)/2;
if(arr[position]==n){
return position;
}
else if(n>arr[position]){
return getPosition(arr,n,position+1,end);
}
else{
return getPosition(arr,n,start,position-1);
}
}
}
总结
算法这个东西,有的时候就像数学公式,多写多练,遇到问题,就可以套用了。