在O(n)

时间:2017-08-10 07:49:27

标签: java arrays algorithm data-structures stack

假设我有一个这样的数组:[ 1, 2, 3, 4, 5, 6, 1]

我希望获得类似1 ==>的输出6(对于元素1(0 th 索引,匹配在索引6处找到)

这意味着对于0 th 元素,下一个匹配位于第6个索引处。

如果输入为[4,6,4,6],则输出为4 ==> 2和6 ==> 3

由于在索引2处找到4的第一个匹配(四个),并且在3 rd 索引处找到第一个匹配的六个(2 nd 元素)

如果时间复杂度为O(n 2 ),解决方案非常简单。我试图使用堆栈在O(n)中使用此代码找到下一个最大的元素。但我无法找到为下一个相同元素做同样事情的方法。

import java.util.Scanner;
import java.util.Stack;

public class NextGreatestElement {
    public static void main(String[] args) {
        int[] inp = {1,4,6,2,39};
        Stack<Integer> stack = new Stack<>();
        stack.push(inp[0]);
        for (int i = 1; i < inp.length; i++) {
            int element = inp[i];
            if (element > stack.peek()) {
                System.out.println(stack.peek() + " ==> " + element);
                stack.pop();
                while (!stack.isEmpty()) {
                    System.out.println(stack.pop() + " ==> " + element);
                }
                stack.push(element);
            } else if (element < stack.peek()) {
                stack.push(element);
            }
        }
        while (!stack.isEmpty()) System.out.println(stack.pop() + " ==> " + (-1));
    }
}

即使算法也足够了。我不需要代码。

3 个答案:

答案 0 :(得分:2)

无法在O(n)中使用堆栈实现它。您可以采用HashMap并从右向左迭代,以保存最后一次出现的数字。它会为您提供O(n)平均时间复杂度:

int[] inp = {1, 2, 3, 1, 2, 1, 3};
Map<Integer, Integer> h = new HashMap<>();
List<Integer> result = new ArrayList<>();

for (int i = inp.length - 1; i >= 0; --i) {
    int cur = inp[i];
    int next = -1;
    if (h.containsKey(cur)) {
        next = h.get(cur);
    }   
    h.put(cur, i);
    result.add(next);
}

for (int i = 0; i < inp.length; ++i) {
    System.out.println("Number " + inp[i] + " next occurence at index " + result.get(inp.length - i - 1));
}

Runnable版本:http://ideone.com/i6Cx09

答案 1 :(得分:1)

如果你想要元素或者让数组中出现的元素超过1ce,我就不会错。你可以这样做。

此解决方案将 nlogn

  1. 对数组进行排序(升序)
  2. 循环数组然后比较
  3. 如果a [i] == a [i + 1]则list.add(a [i]);
  4. 像这样的事情 enter image description here

答案 2 :(得分:-1)

使用散列图或散列表

从右向左遍历,第一次将值输入集合

collection_object.put(inp[i], ""+i)

下次遇到时只需更改值

value = collection_object.get(inp[i])
v = value.split("==>")
value = v[0] + "==>" + i
collection_object.put(inp[i], value)