Javascript 从数字数组中删除一个数字以对数组进行排序
我们有一个数字数组,我们需要找到我们可以删除数组中一个数字的方法的总数,如果删除它,将对数组进行排序 例如,如果我们有[3,4,5,4],我们应该返回2,因为如果我们删除5或第二个4,我们的数组将被排序 但是如果我们得到像[4,5,2,3,4]这样的值,我们应该返回0,因为删除它们中的任何一个都不会对数组排序 我相信这与 如果我错了,请纠正我,但这应该是这样的: 我们应该找到最长的递增子序列并删除不在该子序列中的所有内容 考虑到这一点,我使用了如下函数来查找LIS:Javascript 从数字数组中删除一个数字以对数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我们有一个数字数组,我们需要找到我们可以删除数组中一个数字的方法的总数,如果删除它,将对数组进行排序 例如,如果我们有[3,4,5,4],我们应该返回2,因为如果我们删除5或第二个4,我们的数组将被排序 但是如果我们得到像[4,5,2,3,4]这样的值,我们应该返回0,因为删除它们中的任何一个都不会对数组排序 我相信这与 如果我错了,请纠正我,但这应该是这样的: 我们应该找到最长的递增子序列并删除不在该子序列中的所有内容 考虑到这一点,我使用了如下函数来查找LIS: function findS
function findSubsequence(arr){
var allSubsequence = [],
longestSubsequence = null,
longestSubsequenceLength = -1;
for(var i=0;i<arr.length;i++){ //i=1
var subsequenceForCurrent = [arr[i]],
current = arr[i],
lastElementAdded = -1;
for(var j=i;j<arr.length;j++){
var subsequent = arr[j];
if((subsequent > current) && (lastElementAdded<subsequent)){
subsequenceForCurrent.push(subsequent);
lastElementAdded = subsequent;
}
}
allSubsequence.push(subsequenceForCurrent);
}
for(var i in allSubsequence){
var subs = allSubsequence[i];
if(subs.length>longestSubsequenceLength){
longestSubsequenceLength = subs.length;
longestSubsequence = subs;
}
}
return longestSubsequence;
}
(function driver(){
var sample = [87,88,91, 10, 22, 9,92, 94, 33, 21, 50, 41, 60, 80];
console.log(findSubsequence(sample));
})();
函数查找子序列(arr){
var allSubsequence=[],
longestSubsequence=null,
最长子序列长度=-1;
对于(var i=0;i,您可以使用数学库删除最大值
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
var sample = [87,88,91, 10, 22, 9,92, 94, 33, 21, 50, 41, 60, 80];
sample.sort(function(a, b){return a - b});
list = remove_highest(sample)
console.log(list) // [9, 10, 21, 22, 33, 41, 50, 60, 80, 87, 88, 91, 92]
function remove_highest(list) {
return list.filter(function(n) { return n != Math.max.apply( Math, list ) })
}
</script>
</body>
</html>
var样本=[87,88,91,10,22,9,92,94,33,21,50,41,60,80];
sort(函数(a,b){返回a-b});
列表=删除(样本)
console.log(列表)/[9,10,21,22,33,41,50,60,80,87,88,91,92]
功能删除(列表){
return list.filter(函数(n){return n!=Math.max.apply(Math,list)})
}
这种方法似乎有点复杂。我认为使用蛮力方法会更清晰,也不会占用太多资源:对于数组中的每一项,尝试删除它,然后检查数组是否已排序。但不要使用排序
来检查它是否已排序(这具有O(N log N)
复杂性),只需检查数组中的每个项是否与前一项相同或更大(O(N)
):
const checkSorted=arr=>arr.every((num,i,arr)=>i==0 | | num>=arr[i-1]);
const checkRemovalCount=arr=>arr.reduce((countSoFar,i,arr)=>{
常量removedArr=[…arr.slice(0,i),…arr.slice(i+1)];
返回countSoFar+checkSorted(removedArr);
}, 0);
日志(checkRemovalCount([3,4,5,4]);
日志(checkRemovalCount([4,5,2,3,4]);
log(checkRemovalCount([87,88,91,10,22,9,92,94,33,21,50,41,60,80]))
您的意思是删除最高数字而不改变位置?如果4不是最高数字,而是5,为什么您可以删除4?@VasimVanzara应该返回通过删除其中一个来删除最高数字的方法数。@CertainPerformance我应该找到所有可能的方法,从数组中删除一个数字,这样一个选项是5,这将给我们3,4,4,这仍然是排序,另一个是删除最后的4,这将给我们3,4,5@EmadDehnavi此时,问题描述似乎有点模糊,因为当前的问题描述说删除最高数字之一。在[3,1,4,5]
1是最低的数字,但它也是第四高的数字。当然,对于长度为L的数组,任何数字都将是第十高的数字之一。因此,关于最高数字的部分可能没有限制性,也没有任何作用,或者如果我误解了,那么可能需要在数学上更正式一些。但它应该是如果仅从数组中删除它,请对数组进行排序。删除后,您可以对数组进行排序。@EmadDehnavi我已更新了我的答案。上述代码的输出将是[9、10、21、22、33、41、50、60、80、87、88、91、92],这是最好的方法。