将每个元素替换为下一个最大的元素(按升序排列,而不是用-1代替)

时间:2018-11-28 18:32:38

标签: java arrays algorithm dynamic-programming

当前正在研究一种用下一个最大元素替换每个元素的算法,但是与此处的其他一些问题不同,如果没有这样的数字,则该问题与将值替换为-1无关,并且必须按升序排列。

输入以下内容:{1、5,-3、2、8、4、7、10、3、11、2}

必须获得以下输出:1 5 5 5 8 8 8 10 10 11 11

这是我到目前为止所拥有的:

class Playground {
static void nextGreatest(int arr[])  { 
    int size = arr.length; 

    // Initialize the next greatest element 
    int max_from_right =  arr[size - 1]; 

    // Replace all other elements with the next greatest 
    for (int i = 1; i < size; i++) 
    { 
        // Store the current element (needed later for 
        // updating the next greatest element) 
        int temp = arr[i]; 

        // Replace current element with the next greatest 
        arr[i] = max_from_right; 

        // Update the greatest element, if needed 
        if(max_from_right < temp) { 
            max_from_right = temp;
        } 
    } 
} 

// prints the array 
static void printArray(int arr[]) 
{ 
    for (int i=0; i < arr.length; i++) 
    System.out.print(arr[i]+" "); 
} 

public static void main (String[] args) {
    int arr[] = {1, 5, -3, 2, 8, 4, 7, 10, 3, 11, 2 }; 
    nextGreatest (arr); 
    printArray (arr); 

    }
}

我现在得到以下信息:

1 2 5 5 5 8 8 8 10 10 11

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:1)

请考虑以下内容:

int currMax = -1;
int[] input = {1, 5, -3, 2, 8, 4, 7, 10, 3, 11, 2};

for (int i = 0; i < input.length; i++){
    if (input[i] > currMax){ // if we find a new max element
        currMax = input[i];
    }
    else if (input[i] < currMax){ // if value is less then max we replace it
        input[i] = currMax;
    }
}

System.out.println(Arrays.toString(input));
> [1, 5, 5, 5, 8, 8, 8, 10, 10, 11, 11]

答案 1 :(得分:1)

(不确定我是否完全理解您的问题,但是基于评论的澄清,这是我的答案...)

似乎您只需要将初始最大初始化更改为第一个元素,而不是最后一个元素。

int currentMax =  arr[0];

for (int i = 1; i < size; i++) {
    int temp = arr[i];
    arr[i] = currentMax;
    if(currentMax < temp) {
        currentMax = temp;
    }
}

该解决方案最终显示为对于每个索引i,到目前为止看到的最大元素是什么