数组中每个数右边第一个比它大的元素 java实现

如数组A=[1,5,3,6,4,8,9,10] 输出[5, 6, 6, 8, 8, 9, 10, -1]

如数组A=[8, 2, 5, 4, 3, 9, 7, 2, 5] 输出[9, 5, 9, 9, 9, -1, -1, 5, -1]

1、暴力遍历

复杂度为O(n^2)的解法,遍历数组中的每一个后面所有元素,找到第一个大于它的,输出即可

	public static int[] findMaxRight(int[] array) {
		if(array == null)
			return array;
		int size = array.length;
		int[] result = new int[size];
		for (int i = 0; i < size - 1; i++) {
			for (int j = i+1; j < size; j++) {
				if(array[j] > array[i]) {
					result[i] = array[j];
					break;
				}
			}
		}
		result[size-1] = -1;//最后元素没有右边元素
		return result;
	}

2、借助栈,时间复杂度O(n)

具体思路是:我们用栈来保存未找到右边第一个比它大的元素的索引(保存索引是因为后面需要靠索引来给新数组赋值),初始时,栈里放的是第一个元素的索引0值。

第二种方是以空间换时间,用到了数据结构栈,用到了单调栈思想,单调栈可以用来解决一类问题,单调栈是指:栈内元素保持一定单调性(单调递增或单调递减)的栈。这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。既然是栈,就满足后进先出的特点。与之相对应的是单调队列。

public static int[] findMaxRight(int[] array) {
		if(array == null)
			return array;
		int size = array.length;
		int[] result = new int[size];
		Stack<Integer> stack = new Stack<>();
		stack.push(0);
		int index = 1;
		while(index < size) {
			if(!stack.isEmpty() && array[index] > array[stack.peek()]) {
				result[stack.pop()] = array[index];
			}else {
				stack.push(index);
				index++;
			}
		}
		if(!stack.isEmpty())
			result[stack.pop()] = -1;
		return result;
	}

主函数:

public static void main(String[] args) {
		int[] arr = {1,5,3,6,4,8,9,10};
		int[] res = findMaxRight(arr);
		for (int i = 0; i < res.length; i++) {
			System.out.print(res[i] +" ");
		}
	}
发布了114 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44026997/article/details/104352797
今日推荐