讓我們假設我們有這些元素的數組(總是排序)。在數組中查找範圍
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
我們的目標是找到給定值的最小索引和最大索引,例如,讓我們假設我們正在尋找的元素3.
我們很快看到的最小指數和最大指數,將最低指數爲3,並在最大指數爲11。
對於值1,最小值爲0,最大值爲3.
您將如何開發一個解決方案,返回JavaScript中的最小值和最大值?我試圖做到這一點,但我無法想象如何,我總是得到錯誤的答案。
讓我們假設我們有這些元素的數組(總是排序)。在數組中查找範圍
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
我們的目標是找到給定值的最小索引和最大索引,例如,讓我們假設我們正在尋找的元素3.
我們很快看到的最小指數和最大指數,將最低指數爲3,並在最大指數爲11。
對於值1,最小值爲0,最大值爲3.
您將如何開發一個解決方案,返回JavaScript中的最小值和最大值?我試圖做到這一點,但我無法想象如何,我總是得到錯誤的答案。
你可以嘗試Array.indexOf()
和Array.lastIndexOf()
var sortedArr =[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];
console.log(sortedArr.indexOf(1));
console.log(sortedArr.lastIndexOf(1));
明顯的答案 – MrFabio
這是你想要的嗎?
var myarr = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];
var minNum = myarr[0];
var maxNum = myarr[1];
var minNumStartINDX, maxNumStartINDX, minNumEndINDX, maxNumEndINDX;
/********************************************/
for (var x = 0; x < myarr.length; ++x) {
if (minNum >= myarr[x]) {
minNum = myarr[x];
minNumEndINDX = x;
}
}
for (var x = 0; x < myarr.length; ++x) {
if (minNum >= myarr[x]) {
minNumStartINDX = x;
break;
}
}
for (var x = 0; x < myarr.length; ++x) {
if (maxNum <= myarr[x]) {
maxNum = myarr[x];
maxNumEndINDX = x;
}
}
for (var x = 0; x < myarr.length; ++x) {
if (maxNum <= myarr[x]) {
maxNumStartINDX = x;
break;
}
}
/********************************************/
console.log(minNum);
console.log(minNumStartINDX + "-" + minNumEndINDX);
console.log(maxNum);
console.log(maxNumStartINDX + "-" + maxNumEndINDX);
基本上Array.indexOf()
和Array.lastIndexOf()
將做到這一點,但他們會做一個線性搜索(經過一個循環整個陣列,直到元素被發現),這是線性時間O(n)
顯然做。
如果你的數組總是被排序,那麼我們可以使用這個屬性來優化它,並使用二分搜索。這是更快的方式,並將在對數時間O(log n)
。
之後,我們簡單地檢查找到的索引之前(和之後)的元素,直到找到一個不等於我們元素的元素。
爲了找到最後一個實例:
var i= foundIndex;
while(sortedArr[i] == sortedArr[foundIndex]){
i++;
}
foundIndex = i;
而對於第一次出現:
var i= foundIndex;
while(sortedArr[i] == sortedArr[foundIndex]){
i--;
}
foundIndex = i;
這就是它!這對運行時會有很大的幫助,特別是如果你有大陣列的話。 您可以在任何地方找到二進制搜索實現,只需使用它們中的任何一個即可。
這不是http://codegolf.stackexchange.com/ – deltree
[Array.indexOf()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf )和[Array.lastIndexOf()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf)是您的答案,下次發佈代碼。 – Gintoki
這是功課....? – Darren