假设我有一个这样的数组:[ 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));
}
}
即使算法也足够了。我不需要代码。
答案 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
答案 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)