![](/img/trans.png)
[英]Find how many items in array are greater equal or less than given number Javascript
[英]How to find a number that occurs the most in an array in less than O(n)?
我一直在研究一些編碼Katas,以改進我的編程。 我的問題是如何用小於 O(n)的方法解決此問題。 我的第一個想法是使用正則表達式,但是遇到了以下概述的一些問題。
使用JavaScript語言,使函數SimpleMode(arr)接受存儲在arr中的數字數組,並返回最常出現的數字(模式)。 例如:如果arr包含[10、4、5、2、4],則輸出應為4。如果有多個模式,則返回第一個出現在數組中的模式(即[5、10、10、6] ,,5]應該返回5,因為它首先出現。 如果沒有模式,則返回-1。 數組不會為空。
這是我能夠想到的O(n)解決方案:
function simpleMode(set) { var counter = {}; var most = set.reduce(function(most, value) { if (!counter[value]) { counter[value] = 0; } counter[value]++; if (!counter[most] || counter[value] > counter[most]) { most = value; } return most; }, -1); return (counter[most] === 1 ? -1 : most); }; console.log(simpleMode([5, 2, 5, 2, 3, 1]));
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
該解決方案的問題在於,它不符合返回最先出現的值的要求。 同樣,我覺得使用sort
有點作弊,但它仍應小於O(n)。
function simpleMode(set) { var values = set.sort().join('') var regex = new RegExp(/(\\d)\\1+/g); var matches = regex.exec(values); return (matches ? matches[1] : -1); } console.log(simpleMode([5, 2, 5, 2, 3, 1]));
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
這樣的算法是不可能的。 假設任何算法查看的數組少於n / 2個元素。 然后,如果未查看的元素相同,則它們將是最常見的值。
因此, 任何找到最常見元素的算法都必須始終查看數組的n / 2個元素,因此其時間復雜度必須至少為O(n)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.