从数字数组中删除一个数字以对数组进行排序

时间:2018-08-18 05:34:55

标签: javascript arrays sorting

我们有一个数字数组,我们需要找到可以删除数组中一个数字的总数,如果删除该数字,将对该数组进行排序。

例如,如果我们有[3,4,5,4],我们应该返回2,因为如果我们删除5或第二个4,我们的数组将被排序。

但是,如果我们得到类似[4,5,2,3,4]的信息,则应该返回0,因为删除其中的任何一个都不会对数组进行排序。

我认为这与Longest increasing subsequence

有关

如果我错了,请纠正我,但这应该像这样工作:

我们应该找到增长最长的子序列,并删除该子序列中没有的所有内容。

考虑到这一点,我使用了类似这样的函数来查找LIS:

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));
})();

但这给了我最高的数字,我不确定如何删除其中一个以保持数组排序并找到所有可能的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这种方法似乎有点复杂。我认为使用蛮力方法会更节省大量资源:对于数组中的每个项目,尝试将其删除,然后检查数组是否在之后进行排序。但是,请勿使用sort来检查其是否已排序(复杂度为O(N log N)),而只需检查数组中的每个项目都等于或大于上一个项目({{ 1}}):

O(N)

答案 1 :(得分:-2)

您可以使用数学库删除最高的数字。

<!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>