找到数组中的下一个最小值?

时间:2018-05-28 04:37:51

标签: arrays

这个问题一直困扰着我。基本上,如果你有一个输入数组[4,5,2,6,7,1],4和5的下一个最小数字是2,而6和7是1.我需要识别这些较小的数字。我有一个明显的n ^ 2解决方案,但我觉得有一个O(n)解决方案及时。我需要对右边的下一个最小数字的存在采取行动,并且在右边没有较小数字的情况下也采取行动。

我已经尝试过思考动态编程解决方案和数据结构(特别是堆栈),但我似乎无法保持正确性和O(n)时间复杂度,无论是一个还是其他似乎为我失败。

任何帮助?

4 个答案:

答案 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