鍍金池/ 問答/HTML/ 一道二分法的算法題

一道二分法的算法題

1.
下面數(shù)組是從1到n連續(xù)的數(shù)組(n>2),從中間折斷交換順序后,用二分法找到數(shù)組中 1 的索引。

數(shù)組: [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:先對數(shù)組進(jìn)行升序排序
例: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))

面試官說不行,不能先拼,直接二分法查找??二分法不在一個(gè)有序的數(shù)列里怎么使用?感覺是被搞了么

回答
編輯回答
尐飯團(tuán)

排完序數(shù)組第一個(gè)不就是1嗎還二分干啥?而且,有排序的功夫,復(fù)雜度o(nlogn),你掃一遍數(shù)組不都掃出來了么?所以先排序再二分查找的點(diǎn)在哪里?

不對,你的答案有個(gè)奇怪的東西?。。?!你都知道切割位置是 9 了,還從 9 的位置處 slice 開,再交換位置 concat 再二分查找? What? 什么鬼,你要是都知道要從 9 的地方切開數(shù)組,那答案就是 9+1 ?。。。。?/p>

所以說先審題。

  1. 數(shù)組是一個(gè)1到n的有序數(shù)組從中間折斷再拼接的,所以說數(shù)組本身前后兩部分都是有序的
  2. 要查找的是1的位置,說白了就是查找數(shù)組折斷再拼接的位置

解:若 i < j < k 則升序數(shù)組中 arr[i] < arr[j] < arr[k] 。如果 i、k 是二分中的 low 和 high, j 是中值,不等式哪邊不成立,就說明哪邊不是連續(xù)遞升,拼接點(diǎn)就在哪端。

2018年4月29日 14:09
編輯回答
我以為

排序后還要找?不是直接在第一個(gè)了么?所以你的答案有什么意義!

2018年9月6日 18:57