简介: 就我所能搜索到的而言,尚无此问题。
这是一个面试问题。
我什至没有专门寻找代码解决方案,任何算法/伪代码都可以使用。
问题: 给定一个整数数组int[] A
及其大小N
,找到2个最小和的 非后续
元素(在数组中不能相邻)。另外,答案中不得包含第一个或最后一个元素(index 0
和n-1
)。解决方案还应该是 O(n)
时间和空间的复杂性。
例如,当A = [5, 2, 4, 6, 3, 7]
回答是5
,因为2+3=5
。
当A = [1, 2, 3, 3, 2, 1]
答案为时4
,因为2+2=4
和不能选择的任何一个,1
因为处于数组的末尾。
尝试: 最初,我认为解决方案中的 一个 数字 必须 是数组中最小的数字(除了第一个和最后一个),但这很快被反例反驳了
A = [4, 2, 1, 2, 4]
-> 4 (2+2)
然后我想如果我在数组中找到 2个
最小的数字(除了第一个和最后一个),解决方案将是这两个。这显然很快失败了,因为我无法选择2个相邻的数字,如果必须选择非相邻的数字,那么这就是问题的定义:)。
最后, 我想,好吧,我只会在数组中找到 3个 最小的数字(除了第一个和最后一个),而且解决方案必须是其中的两个,因为其中两个 必须
彼此不相邻。由于,这 也 失败了A = [2, 2, 1, 2, 4, 2, 6]
-> 2+1=3
,因为它似乎可以工作,因为我会找到2, 1, 2
,但是假设我找到了2, 1, 2
in索引,1, 2, 3
则 不一定
奏效(如果我专门找到了2
in索引,5
但不幸的是我不能保证)。
问题: 现在我很困惑,有人可以提出可行的解决方案/想法吗?
这是算法的实时javascript实现,该算法可以:
function findMinNonAdjacentPair(a) {
var mins = [];
// quick exits:
if (a.length < 5) return {error: "no solution, too few elements."};
if (a.some(isNaN)) return {error: "non-numeric values given."};
// collect 4 smallest values by their indexes
for (var i = 1; i < a.length - 1; i++) { // O(n)
if (mins.length < 4 || a[i] < a[mins[3]]) {
// need to keep record of this element in sorted list of 4 elements
for (var j = Math.min(mins.length - 1, 2); j >= 0; j--) { // O(1)
if (a[i] >= a[mins[j]]) break;
mins[j+1] = mins[j];
}
mins[j+1] = i;
}
}
// mins now has the indexes to the 4 smallest values
// Find the smallest sum
var result = {
sum: a[mins[mins.length-1]]*2+1 // large enough
}
for (var j = 0; j < mins.length-1; j++) { // O(1)
for (var k = j + 1; k < mins.length; k++) {
if (Math.abs(mins[j] - mins[k]) > 1) { // not adjacent
if (result.sum > a[mins[j]]+a[mins[k]]) {
result.sum = a[mins[j]]+a[mins[k]];
result.index1 = mins[j];
result.index2 = mins[k];
};
if (k < j + 3) return result; // cannot be improved
break; // exit inner loop: it cannot bring improvement
}
}
}
return result;
}
// Get I/O elements
var input = document.getElementById('in');
var output = document.getElementById('out');
var select = document.getElementById('pre');
function process() {
// translate input to array of numbers
var a = input.value.split(',').map(Number);
// call main function and display returned value
output.textContent = JSON.stringify(findMinNonAdjacentPair(a), null, 4);
}
// respond to selection from list
select.onchange = function() {
input.value = select.value;
process();
}
// respond to change in input box
input.oninput = process;
// and produce result upon load:
process();
Type comma-separated list of values (or select one):</br>
<input id="in" value="2, 2, 1, 2, 4, 2, 6"> <=
<select id="pre">
<option value="5, 2, 4, 6, 3, 7">5, 2, 4, 6, 3, 7</option>
<option value="1, 2, 3, 3, 2, 1">1, 2, 3, 3, 2, 1</option>
<option value="4, 2, 1, 2, 4">4, 2, 1, 2, 4</option>
<option value="2, 2, 1, 2, 4, 2, 6" selected>2, 2, 1, 2, 4, 2, 6</option>
</select>
</br>
Output:</br>
<pre id="out"></pre>
该算法有几个循环,具有以下big-O复杂性:
因此,该算法在 O(n)中 运行。
我正在努力完成作业,需要一点推动-问题是设计一个算法,在O(nlogm)时间内找到多个最小元素 希望您能指点一下方向。谢谢
问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:
我得到了一个
你是一个电视游戏节目的参与者,这给了你赢得奖金的机会。在游戏中,你会看到一系列框,每个框都包含一个允许你看到的正整数值。你有机会选择任何数量的盒子。您的总奖金是您选择包含的所有盒子的总和。这个游戏只有一个限制:如果你选择了两个连续的盒子,你不允许在总数中添加任何后续的盒子,而你的奖品是截至该点的累计金额。你的目标是最大化你的奖金。 给定一个正整数数组,代表游戏中呈现给你的每个盒子的值,返回你能赢得
这可能是微软的面试问题。 从排序的数组中找出第k个最小的元素(忽略重复项) [编辑]:数组可能包含重复项(未指定)。 想了很多次,但仍然质疑自己:还有更好的解决方案吗? 取最大堆 时间复杂度:O(NlogK) 空间复杂度:O(K) 这些元素可能是重复的。所以,通过与以前的元素进行比较来检查是否有唯一的元素 还可以使用改进版的快速排序分区算法。但它可能会导致最坏的情况,因为数组已经排序<这里出现了两