我们有一个数字数组,我们需要找到可以删除数组中一个数字的总数,如果删除该数字,将对该数组进行排序。
例如,如果我们有[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));
})();
但这给了我最高的数字,我不确定如何删除其中一个以保持数组排序并找到所有可能的方法。
有什么想法吗?
答案 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>