《Cracking the Coding Interview程式設計師面試金典》----下一個較大元素(所有比他大中最小的)

塵封的記憶0發表於2017-05-03
時間限制:3秒 空間限制:32768K 熱度指數:540
本題知識點: 查詢 排序 
 演算法知識視訊講解

題目描述

現在有一個陣列,請找出陣列中每個元素的後面比它大的最小的元素,若不存在則為-1。

給定一個int陣列A及陣列的大小n,請返回每個元素所求的值組成的陣列。保證A中元素為正整數,且n小於等於1000。

測試樣例:
[11,13,10,5,12,21,3],7

[12,21,12,12,21,-1,-1]

思路:利用集合,這道題可以變得比較簡單。

程式碼如下:

#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
vector<int> findNext(vector<int> A, int n)
{
	set<int> ss;
	vector<int> result;
	for (int i = n - 1; i >= 0; --i) {
		auto pos = ss.lower_bound(A[i]);
		if (pos != ss.end() && *pos == A[i])
			++pos;

		if (pos == ss.end()) {
			result.push_back(-1);
		}
		else {
			result.push_back(*pos);
		}
		ss.insert(A[i]);
	}
	reverse(result.begin(), result.end());
	return result;
}

void printVector(vector<int>mat, int n)
{
	for (int j = 0; j < n; j++)
	{
		cout << mat[j] << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> v;
	int m;
	int temp;
	while (cin >> m)
	{
		v.clear();
		for (int j = 0; j < m; j++)
		{
			cin >> temp;
			v.push_back(temp);
		}
		printVector(findNext(v, m), m);
	}
	return 0;
}

不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~



相關文章