A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 复仇的撒旦 中级黑马   /  2015-3-2 11:23  /  974 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给定一个数字,插入一个有序的数组中,要求数组仍然有序
public static int getIndex_2(int[] arr,int key)
        {
                int min = 0,max = arr.length-1,mid;

                while(min<=max)
                {
                        mid = (max+min)>>1;

                        if(key>arr[mid])
                                min = mid + 1;
                        else if(key<arr[mid])
                                max = mid - 1;
                        else
                                return mid;
                }
                return min;
求解答,最后一句为什么是返回min  我觉得返回mid?

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1

查看全部评分

5 个回复

倒序浏览
因为这样会出现问题,有时候应该返回mid,但有时候又应该返回mid+1,多想想,你总会明白的
回复 使用道具 举报
最后一个return min是在数组中不存在这个数key,且min>max时才读到的,此时的min刚好比max大1,那么此时的mid=(max+min)>>1=max,而我们要找的是插入位置,此插入位置应该在mid的后一位,当然就是min了
回复 使用道具 举报
本帖最后由 wdhm5423 于 2015-3-2 12:54 编辑

当程序跳出循环,说明key的大小不在数组的最小和最大范围内。
分两种情况:
当key比数组最小还小,那么循环内始终都是max=mid-1,min=0,直到max=min-1=-1;要返回也是返回max,-1表示要插入到开头。
当key比数组最大还大,那么循环内始终都是min=mid+1,max=arr.length-1,直到min=max+1=arr.length;要返回也是返回min,arr.length表示要插入到结尾。所以可以在进入循环之前加入:
if(key<arr[0])  return -1;
if(key>arr[arr.length-1]) return arr.length;
或在循环之后加入:
if(key<arr[0])  return max;
if(key>arr[arr.length-1]) return min;

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
因为当key的值大于arr[mid]时,min=mid+1;这样查找下来,最终key应插入的位置是min
回复 使用道具 举报
wdhm5423 发表于 2015-3-2 12:51
当程序跳出循环,说明key的大小不在数组的最小和最大范围内。
分两种情况:
当key比数组最小还小,那么循环 ...

很详细呀~!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马