我已参考GeeksforGeeks的this问题解决了Next Greater Element问题。我很困惑地发现以下问题的时间复杂度(Big O)。 如果有人可以帮助我,这将真的很有帮助。
问题: 给定一个数组,为每个元素打印下一更大元素(NGE)。元素x的下一个更大元素是数组x中右侧第一个更大的元素。对于没有更大元素的元素,请将下一个更大元素视为-1。
示例:
a)对于任何数组,最右边的元素总是下一个更大的元素为-1。
b)对于以降序排列的数组,所有元素的下一个更大元素为-1。
这是解决此问题的可接受方法吗?
int[] array = {20,10,5,3};
int len =array.length;
int[] temp = new int[len];
int j=0;
int i=j;
while(j<len-1){
++i;
if(i>=len){
System.out.println(array[j]+"----> -1");
j++; i=j;
continue;
}
if(array[j]<array[i]){
System.out.println(array[j]+"----> "+array[i]);
j++; i=j;
}
}
System.out.println(array[j]+"----> -1");
答案 0 :(得分:1)
由于使用var str='Aug 19th 2018'.replace(/(\w{3})\s(\d{1,})\w{2}\s(\d{4})/,function(match,m,d,y){
return ({'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'})[m]+'-'+d+'/'+y;
});
console.log(str);
,因此难以确定算法的复杂性,这给推理增加了不必要的困难。
重写为以下内容(不使用continue
或break
):
continue
现在很明显这是public void test() {
int[] array = {10, 20, 3, 5};
int len = array.length;
for (int j = 0; j < len - 1; j++) {
int nge = -1;
for (int i = j + 1; i < len && nge < 0; i++) {
if (array[j] < array[i]) {
nge = array[i];
}
}
System.out.println(array[j] + "----> " + nge);
}
System.out.println(array[len-1] + "----> -1");
}
,因为外部循环迭代到O(n lg n)
,内部循环迭代到n
。