題目來源
我一開始想的是用一個哈希表來記錄nums2里的每個元素的位置,然后遍歷nums1,直接根據哈希表從對應位置往后遍歷比較,代碼如下:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
int n1 = findNums.size(), n2 = nums.size();
vector<int> res(n1, -1);
unordered_map<int, int> map;
for (int i=0; i<n2; i++) {
map[nums[i]] = i;
}
for (int i=0; i<n1; i++) {
for (int j=map[findNums[i]]; j<n2; j++)
if (findNums[i] < nums[j]) {
res[i] = nums[j];
break;
}
}
return res;
}
};
然后看了答案,只需要O(n)的方法就可以了,就是設置一個棧,遍歷nums2,進棧使得棧中是遞減序列,假如出現一個大的,就把棧中小的出棧并且記錄在map中,剛才出列的那些元素后面大的元素就是剛進棧的那個。
而且不需要另外設置一個nums1大小的空間,直接用就可以了。
代碼如下:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
int n1 = findNums.size(), n2 = nums.size();
unordered_map<int, int> map;
stack<int> s;
for (int i=0; i<n2; i++) {
while (!s.empty() && nums[i] > s.top()) {
int tmp = s.top();
map[tmp] = nums[i];
s.pop();
}
s.push(nums[i]);
}
for (int i=0; i<n1; i++) {
if (map.find(findNums[i]) != map.end())
findNums[i] = map[findNums[i]];
else
findNums[i] = -1;
}
return findNums;
}
};