为了账号安全,请及时绑定邮箱和手机立即绑定

一道二分法的算法题

一道二分法的算法题

jeck猫 2019-03-20 14:34:23
1.下面数组是从1到n连续的数组(n>2),从中间折断交换顺序后,用二分法找到数组中 1 的索引。数组: [n-x+1, n-x+2, ..., n - 1, n, 1, 2, 3, 4, 5, ..., n-x]示例: [7,8,9,10,11,12,13,14,15,1,2,3,4,5,6]我的答案:step1:先对数组进行升序排序例:n=15,x=9,arr=[7,8,9,10,11,12,13,14,15,1,2,3,4,5,6]arr.slice(n-x-1,x).concat(arr.slice(0,n-x-1))step2:二分法查找function getLocation(arr, key, startNum, endNum) {  if (arr == null) return -1;  var middleNum = Math.floor((startNum + endNum) / 2);  console.log("中间值:" + middleNum);  if (startNum < endNum) {    if (key == arr[middleNum]) {      return middleNum + 1;    } else if (key < arr[middleNum]) {      return getLocation(arr, key, startNum, middleNum);    } else {      return getLocation(arr, key, middleNum, endNum);    }  } else if (startNum == endNum) {    return startNum;  } else {    return -1;  }}console.log(getLocation([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 10, 1, 15))面试官说不行,不能先拼,直接二分法查找??二分法不在一个有序的数列里怎么使用?感觉是被搞了么
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

排完序数组第一个不就是1吗还二分干啥?而且,有排序的功夫,复杂度o(nlogn),你扫一遍数组不都扫出来了么?所以先排序再二分查找的点在哪里?

不对,你的答案有个奇怪的东西!!!!你都知道切割位置是 9 了,还从 9 的位置处 slice 开,再交换位置 concat 再二分查找? What? 什么鬼,你要是都知道要从 9 的地方切开数组,那答案就是 9+1 啊!!!!

所以说先审题。

  1. 数组是一个1到n的有序数组从中间折断再拼接的,所以说数组本身前后两部分都是有序的

  2. 要查找的是1的位置,说白了就是查找数组折断再拼接的位置

解:若 i < j < k 则升序数组中 arr[i] < arr[j] < arr[k] 。如果 i、k 是二分中的 low 和 high, j 是中值,不等式哪边不成立,就说明哪边不是连续递升,拼接点就在哪端。


查看完整回答
反对 回复 2019-03-29
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

排序后还要找?不是直接在第一个了么?所以你的答案有什么意义!


查看完整回答
反对 回复 2019-03-29
  • 2 回答
  • 0 关注
  • 567 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号