一、概述

LeetCode 的下一个更大元素问题指的是:给定一个数组和一个值,在数组中找到比该值大的最小元素,如果没有,则返回 -1。这个问题的解法有多种,其中最常用的是暴力法、二分查找法和栈法。

二、暴力法

暴力法是最简单的解决方法,思路是:从数组的第一个元素开始遍历,如果当前元素大于给定的值,则返回当前元素,否则继续遍历,直到遍历完整个数组,如果没有找到比给定值大的最小元素,则返回 -1。

int nextGreaterElement(vector& nums, int target) {for (int i = 0; i < nums.size(); i++) {if (nums[i] > target) {return nums[i];}}return -1;}
C++

三、二分查找法

二分查找法是一种比较高效的解法,思路是:先将数组排序,然后用二分查找法查找给定值,如果找到了,则返回下一个元素,否则返回 -1。

int nextGreaterElement(vector& nums, int target) {int l = 0, r = nums.size() - 1;while (l <= r) {int mid = (l + r) / 2;if (nums[mid] == target) {if (mid == nums.size() - 1) return -1;else return nums[mid + 1];} else if (nums[mid] < target) {l = mid + 1;} else {r = mid - 1;}}return -1;}
C++

四、栈法

栈法是一种比较高效的解法,思路是:利用栈先将数组中的元素压入栈中,然后从栈顶开始,如果栈顶元素比给定值小,则将栈顶元素出栈,直到栈顶元素比给定值大,则返回栈顶元素,如果栈为空,则返回 -1。

int nextGreaterElement(vector& nums, int target) {stack s;for (int i = 0; i < nums.size(); i++) {s.push(nums[i]);}while (!s.empty()) {int top = s.top();s.pop();if (top > target) {return top;}}return -1;}
C++