数据结构与算法学习(8)

数据结构与算法学习(8)

一.前缀树

struct TrieNode
{
	int pass;
	int end;
	unordered_map<char, TrieNode*> nexts;
	TrieNode() :pass(0), end(0) {}
};
struct Trie
{
private:
	TrieNode* root;
public:
	Trie()
	{
		root = new TrieNode();
	}
	void Insert(string val) {
		TrieNode* node = root;
		node->pass++;
		for (auto c : val)
		{
			if (node->nexts.count(c) <= 0)
				node->nexts[c] = new TrieNode();
			node = node->nexts[c];
			node->pass++;
		}
		node->end++;
	}
	int Search(string val) {
		TrieNode* node = root;
		for (auto c : val) {
			if (node->nexts.count(c) <= 0)
				return 0;
			node = node->nexts[c];
		}
		return node->end;
	}
	int PrefixNumbers(string val) {
		TrieNode* node = root;
		for (auto c : val) {
			if (node->nexts.count(c) <= 0)
				return 0;
			node = node->nexts[c];
		}
		return node->pass;
	}
	void Delete(string val) {
		if (Search(val) <= 0)return;
		TrieNode* node = root;

		for (int i = 0; i < val.size(); i++) {
			char c = val[i];
			if (--node->nexts[c]->pass == 0) {
				TrieNode* tmp = node->nexts[c];
				for (int j = i + 1; j < val.size(); j++) {
					TrieNode* t = tmp;
					tmp = t->nexts[val[j]];
					delete t;
					t = nullptr;
				}
				delete tmp;
				tmp = nullptr;
				node->nexts.erase(c);
				return;
			}
			node = node->nexts[c];
		}
		node->end--;
	}
};

二.贪心算法

1.安排会议问题

bool comparator(const Program& a, const Program& b)
{
	return (a.end < b.end);
}
int Test02(vector<Program>& arr, int startTime) {
	sort(arr.begin(), arr.end(), comparator);
	int result = 0;
	for (int i = 0; i < arr.size(); i++)
	{
		if (arr[i].start >= startTime) {
			startTime = arr[i].end;
			result++;
		}
	}
	return result;
}

2.最低字典序结合字符串

bool comparator1(const string& a, const string& b) {
	return (a + b).compare((b + a));
}
string Test03(vector<string>& arr) {
	sort(arr.begin(), arr.end(), comparator1);
	string result;
	for (int i = 0; i < arr.size(); i++)
		result.append(arr[i]);
	return result;
}

3.最大利润问题

int Test01(int k, int m, vector<int>& chengBenArr, vector<int>& liRunArr) {
	priority_queue<Node*, vector<Node*>, F1> q1;
	priority_queue<Node*, vector<Node*>, F2> q2;
	for (int i = 0; i < chengBenArr.size(); i++)
		q1.push(new Node(chengBenArr[i], liRunArr[i]));
	for (int i = 0; i < k; i++)
	{
		while (!q1.empty() && q1.top()->chengBen <= m)
		{
			q2.push(q1.top());
			q1.pop();
		}
		if (q2.empty())
			return m;
		m += q2.top()->liRun;
		q2.pop();
	}
	return m;
}

三.堆补充

1.给定数据流,寻找中位数

float Test02(vector<int>& arr) {
	priority_queue<int, vector<int>, less<int>> maxQ;
	priority_queue<int, vector<int>, greater<int>> minQ;
	maxQ.push(arr[0]);
	for (int i = 1; i < arr.size(); i++)
	{
		if (arr[i] <= maxQ.top())
			maxQ.push(arr[i]);
		else
			minQ.push(arr[i]);

		int a = maxQ.size() - minQ.size();
		int b = minQ.size() - maxQ.size();
		if (a >= 2) {
			minQ.push(maxQ.top());
			maxQ.pop();
		}
		else if (b >= 2) {
			maxQ.push(minQ.top());
			minQ.pop();
		}
	}
	if ((maxQ.size() + minQ.size()) % 2 == 0) {
		return (maxQ.top() + minQ.top()) / 2.0f;
	}
	else {
		return maxQ.top();
	}
}

四.八皇后问题

bool IsOk(int arr[], int i, int j) {
	for (int k = 0; k < i; k++)
	{
		if (arr[k] == j || (abs(arr[k] - j) == abs(i - k)))
			return false;
	}
	return true;
}
int Process(int i, int arr[], int n) {
	if (i == n)
		return 1;
	int res = 0;
	for (int j = 0; j < n; j++)
	{
		if (IsOk(arr, i, j)) {
			arr[i] = j;
			res += Process(i + 1, arr, n);
		}
	}
	return res;
}
int Test03(int n) {
	int* arr = new int[n];
	return Process(0, arr, n);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值