这个问题一直困扰着我。基本上,如果你有一个输入数组[4,5,2,6,7,1],4和5的下一个最小数字是2,而6和7是1.我需要识别这些较小的数字。我有一个明显的n ^ 2解决方案,但我觉得有一个O(n)解决方案及时。我需要对右边的下一个最小数字的存在采取行动,并且在右边没有较小数字的情况下也采取行动。
我已经尝试过思考动态编程解决方案和数据结构(特别是堆栈),但我似乎无法保持正确性和O(n)时间复杂度,无论是一个还是其他似乎为我失败。
任何帮助?
答案 0 :(得分:1)
您可以考虑使用堆栈数据结构。我用Java实现了它。这个想法是将索引推送到pop,而堆栈中的顶部索引值大于数组的当前索引值,弹出堆栈并将当前索引处的值分配给poped索引位置。
// Java Implementation of the idea
import java.util.Arrays;
import java.util.Stack;
public class NextSmallest{
public static void main(String[] args) {
int [] A = {4, 5, 2, 6, 7, 1};
int [] ret = nextSmallest(A);
System.out.println(Arrays.toString(ret)); // prints [2, 2, 1, 1, 1, 0]
}
static int [] nextSmallest(int [] A) {
Stack<Integer> stack = new Stack<>();
int n = A.length;
int [] nextSmallestIndex = new int[n];
for(int i = 0; i < n; i++) {
while(!stack.isEmpty() && A[stack.peek()] > A[i]) {
nextSmallestIndex[stack.pop()] = A[i];
}
stack.push(i);
}
return nextSmallestIndex;
}
}
答案 1 :(得分:0)
你可以在所有数组元素上使用这个简单的循环,并获得你想要的数字索引
var arr = [4, 5, 2, 6, 7, 1];
var object = {};
for (var i = 0; i < arr.length; i++) {
if (i > 0 && i < arr.length - 1 && arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) {
object[i] = arr[i];
} else if (i >= arr.length - 1 && arr[i] < arr[i - 1]) {
object[i] = arr[i];
}
}
console.log(object);
输出对象表示下一个最小数字的索引及其值。因此,如果您想要4或5的最小值,因为它们的索引在 2 之前,它们的下一个最小数字将是 object [2] 以及6和7。
完整代码
var arr = [4, 5, 2, 7, 6, 1];
var object = {};
for (var i = 0; i < arr.length; i++) {
if (i > 0 && i < arr.length - 1 && arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) {
object[i] = arr[i];
} else if (i >= arr.length - 1 && arr[i] < arr[i - 1]) {
object[i] = arr[i];
}
}
function getResult(inpArr, number, obj) {
var keys = Object.keys(obj);
var index = inpArr.findIndex(function(itm) {
return itm == number;
});
// the number is not in the array
if (index == -1) {
return null;
}
for (var i = 0; i < keys.length; i++) {
if (index == keys[i]) {
return null;
}
if (index < keys[i]) {
return obj[keys[i]];
}
}
}
console.log("Result for 4: ", getResult(arr, 4, object));
console.log("Result for 5: ", getResult(arr, 5, object));
console.log("Result for 6: ", getResult(arr, 6, object));
console.log("Result for 7: ", getResult(arr, 7, object));
console.log("Result for 1: ", getResult(arr, 1, object));
console.log("Result for 2: ", getResult(arr, 2, object));
答案 2 :(得分:0)
您如何定义起点?如果你知道你想要从元素3开始并从那里开始查看,或者你想找到一个值,并从那个值的任何元素开始并从那里开始?如果没有找到数组其余部分的较低值,会发生什么?
在PHP中,因为我正处于PHP项目的中间,假设您知道要在数组中开始使用哪个元素。
<?php
// our array of numbers
$array=array(4, 5, 2, 7, 6, 1);
// what index are we starting at?
$start=2;
// what index are we comparing to?
$counter=0;
// some output
print("First value is ".$array[$start]." at array element ".$start);
// while the initial value is less or equal to the compare value, AND
// the compare position is within the bounds of the array
// increment the counter - our comparison isn't lower
while((($start+$counter)<count($array))&&($array[($start)]<=$array[($start+$counter)])){
$counter++;
}
// did we make it through without exceeding bounds of array or not?
if(($start+$counter)<count($array)){
print("\nNext lower value is ".$array[($start+$counter)]." at array element ".($start+$counter));
}else{
print("\nEnd of array reached without finding lower value...");
}
print("\n");
?>
答案 3 :(得分:-1)
使用JavaScript中的优化代码以O(n)方式查找以下解决方案
var arr = [4, 5, 2, 7, 6, 1, 3, 4];
function getNextSmallestValue(index){
var elemvalue = arr[index];
var minValue = elemvalue;
for(var i=index;i<arr.length;i++){
if(minValue> arr[i]){
minValue = arr[i];
}
if((minValue!==elemvalue && elemvalue<arr[i]) || i === arr.length-1){
return minValue;
}
}
}
console.log(getNextSmallestValue(0)); // 2
console.log(getNextSmallestValue(3)); // 1