0
点赞
收藏
分享

微信扫一扫

编程算法基础

忍禁 2022-01-24 阅读 20

1.链表反转

//链表
struct ListNode
{
	int m_val;
	ListNode* m_pNext;
	ListNode() :m_val(0), m_pNext(nullptr) {}
	ListNode(int x) :m_val(x), m_pNext(nullptr) {}
	ListNode(int x, ListNode* next) :m_val(x), m_pNext(next) {}
};


//迭代法,保存所有状态变量 :pre->cur->next; O(N),O(1)
ListNode* reverseListTwoPointer(ListNode* head)
{
	if (!head) return nullptr;
	ListNode* next = nullptr, * cur = head, * pre = nullptr;
	while (cur)
	{
		next = cur->m_pNext;
		cur->m_pNext = pre;
		pre = cur;
		cur = next;
	}
	return pre;
}

2.快速排序

void QuikSort(vector<int>& nums, int left, int right)
{
	if (left > right) return;
	int index = PartSort(nums, left, right);
	QuikSort(nums, left, index - 1);
	QuikSort(nums, index + 1, right);
}

int PartSort(vector<int>& nums, int left, int right)
{
	int& base = nums[left];
	while (left < right)
	{
		while (left<right && nums[right]>=base)
		{
			--right;
		}
		while (left<right && nums[left]<=base)
		{
			++left;
		}
		swap(nums[left], nums[right]);
	}
	swap(base, nums[left]);
	return left;
}

void QuikSortNoRecurse(vector<int>& nums)
{
	int left = 0, right = nums.size() - 1, base = nums[left];
	stack<int> indexs;
	indexs.push(left);
	indexs.push(right);
	while (!indexs.empty())
	{
		right = indexs.top(); indexs.pop();
		left = indexs.top(); indexs.pop();
		int index = PartSort(nums, left, right);
		if (left<index -1)
		{
			indexs.push(left);
			indexs.push(index - 1);
		}
		if (right>index+1)
		{
			indexs.push(index + 1);
			indexs.push(right);
		}
	}
}

3.堆排序

void KeepHeap(vector<int>& nums, int index, int len)
{
	int left = 2 * index + 1 , right = 2 * index + 2, max = index;
	if (left < len && nums[left]>nums[max]) max = left;
	if (right < len && nums[right]>nums[max]) max = right;
	if (max!=index)
	{
		swap(nums[index], nums[max]);
		KeepHeap(nums, max, len);
	}
}

void BuildHeapForSort(vector<int>& nums, int heapsize)
{
	//从堆底及进行维护
	for (int i = heapsize/2; i >= 0; i--)
	{
		KeepHeap(nums, i, heapsize);
	}
}

void HeapSort(vector<int>& nums)
{
	BuildHeapForSort(nums, nums.size());
	for (int i = nums.size()-1; i >= 1; i--)
	{
		swap(nums[0], nums[i]);
		KeepHeap(nums, 0, i);
		//BuildHeapForSort(nums, i);//这二者都可以
	}
}

4.二叉树遍历

定义

struct BiTreeNode
{
	int m_val;
	BiTreeNode* m_pLeft;
	BiTreeNode* m_pRight;
    BiTreeNode() : m_val(0), m_pLeft(nullptr), m_pRight(nullptr) {}
    BiTreeNode(int x) : m_val(x), m_pLeft(nullptr), m_pRight(nullptr) {}
    BiTreeNode(int x, BiTreeNode* left, BiTreeNode* right) : m_val(x), m_pLeft(left), m_pRight(right) {}
};

struct BTStatusNode
{
	BiTreeNode* m_pNode;
	bool m_visited;
	BTStatusNode():m_pNode(nullptr),m_visited(false){}
	BTStatusNode(BiTreeNode* node,bool isVisited):m_pNode(node),m_visited(isVisited){}
};

1.前序

void PreOrder(BiTreeNode* root)
{
	if (!root) return;
	cout << root->m_val << " ";
	PreOrder(root->m_pLeft);
	PreOrder(root->m_pRight);
}

void PreOrderNotRecurse(BiTreeNode* root)
{
	if (!root) return;
	stack<BiTreeNode*> nodes;
	while (root || !nodes.empty())
	{
		while (root)
		{
			cout << root->m_val << " ";
			nodes.push(root);
			root = root->m_pLeft;
		}
		if (!nodes.empty())
		{
			root = nodes.top();
			nodes.pop();
			root = root->m_pRight;
		}
	}
}

2.中序

void InOrder(BiTreeNode* root)
{
	if (!root) return;
	InOrder(root->m_pLeft);
	cout << root->m_val <<" ";
	InOrder(root->m_pLeft);
}

void InOrderNotRecurse(BiTreeNode* root)
{
	if (!root) return;
	stack<BiTreeNode*> nodes;
	while (!root || !nodes.empty())
	{
		while (root)
		{
			nodes.push(root);
			root = root->m_pLeft;
		}
		if (!nodes.empty())
		{
			root = nodes.top();
			cout << root->m_val << " ";
			nodes.pop();
			root = root->m_pRight;
		}
	}
}

3.后序

void PostOrder(BiTreeNode* root)
{
	if (!root) return;
	PostOrder(root->m_pLeft);
	PostOrder(root->m_pRight);
	cout << root->m_val << " ";
}

void PostOrderNotRecurse(BiTreeNode* root)
{
	if (!root) return;
	stack<BTStatusNode> statusNodes;
	BTStatusNode tempNode;
	while (root||!statusNodes.empty())
	{
		while (root)
		{
			BTStatusNode node(root, false);
			statusNodes.push(node);
			root = root->m_pLeft;
		}
		if (!statusNodes.empty())
		{
			tempNode = statusNodes.top();
			statusNodes.pop();
			if (tempNode.m_visited == false)
			{
				tempNode.m_visited = true;
				statusNodes.push(tempNode);
				root = tempNode.m_pNode->m_pRight;
			}
			else
			{
				cout << tempNode.m_pNode->m_val << " ";
			}
		}
	}
}

5.LRU

struct DLinkNode
{
public:
	int _val;
	int _key;
	DLinkNode* _pre;
	DLinkNode* _next;
	DLinkNode(): _key(0), _val(0), _pre(nullptr), _next(nullptr) {};
	DLinkNode(int key, int val) :_key(key), _val(val) {};
	DLinkNode(int key, int val,DLinkNode* pre,DLinkNode* next) :_key(key), _val(val),_pre(pre),_next(next) {};
};

class LRUCache
{
public:
	LRUCache(int capacity);
	~LRUCache();
	int get(int key);
	void put(int key, int val);
	void moveNodeToHead(DLinkNode* node);
	void addToHead(DLinkNode* pNode);
	DLinkNode* removeTailNode();

private:
	int _capacity;
	map<int, DLinkNode*> _nodes;
	DLinkNode* _head;
	DLinkNode* _tail;
};
LRUCache::LRUCache(int capacity)
{
	_capacity = capacity;
	_head = new DLinkNode;
	_tail = new DLinkNode;
	_head->_next = _tail;
	_tail->_pre = _head;
}

int LRUCache::get(int key)
{
	if (!_nodes.count(key))
	{
		return -1;
	}
	else
	{
		DLinkNode* pnode = _nodes[key];
		moveNodeToHead(pnode);
		return pnode->_val;
	}
}

void LRUCache::put(int key, int val)
{
	if (!_nodes.count(key))
	{
		DLinkNode* pNode = new DLinkNode(key, val);
		_nodes[key] = pNode;
		//新建节点应加在头节点后!!!!!!
		addToHead(pNode);
		if (_nodes.size()<=_capacity)
		{
			moveNodeToHead(pNode);
		}
		else
		{
			DLinkNode* pNode = removeTailNode();
			_nodes.erase(pNode->_key);
			delete pNode;
		}
	}
	else
	{
		DLinkNode* pNode = _nodes[key];
		pNode->_val = val;
		moveNodeToHead(pNode);
	}
}

void LRUCache::moveNodeToHead(DLinkNode* node)
{
	if (node)
	{
		//删除节点时,顺序不重要
		node->_pre->_next = node->_next;
		node->_next->_pre = node->_pre;
		//插入节点时,先处理插入节点与其后一个节点之间的链接。
		addToHead(node);
	}
}

void LRUCache::addToHead(DLinkNode* pNode)
{
	pNode->_next = _head->_next;
	_head->_next->_pre = pNode;
	_head->_next = pNode;
	pNode->_pre = _head;
}

DLinkNode* LRUCache::removeTailNode()
{
	DLinkNode* node = _tail->_pre;
	_tail->_pre = _tail->_pre->_pre;
	_tail->_pre->_next = _tail;
	_nodes.erase(node->_key);
	return node;
}

 

6.LFU

struct LFUNode
{
	int _key, _val, _freq;
	LFUNode(int key, int val, int freq) :_key(key), _val(val), _freq(freq) {};
};

class LFUCache
{
	int _minfreq, _capacity;
	unordered_map<int, list<LFUNode>::iterator> _key_table;
	unordered_map<int, list<LFUNode>> _freq_table;
public:
	LFUCache(int capacity) :_capacity(capacity)
	{
		_minfreq = 0;
		_key_table.clear();
		_freq_table.clear();
	}
	int get(int key)
	{
		if (_capacity == 0) return -1;
		auto it = _key_table.find(key);
		if (it == _key_table.end()) return -1;
		list<LFUNode>::iterator it2 = it->second;
		int val = it2->_val, freq = it2->_freq;
		//从频率的list中移除当前频率的节点
		_freq_table[freq].erase(it2);
		if (_freq_table[freq].size()==0)
		{
			_freq_table.erase(freq);
			if (_minfreq == freq)
			{
				_minfreq += 1;
			}
		}
		//在新的频率list中插入节点
		_freq_table[freq + 1].push_front(LFUNode(key, val, freq + 1));
		_key_table[key] = _freq_table[freq + 1].begin();
		return val;
	}

	void put(int key, int val)
	{
		if (_capacity == 0) return;
		//迭代器
		auto it = _key_table.find(key);
		if (it == _key_table.end())
		{
			//判断缓存是否已满
			if (_key_table.size()==_capacity)
			{
				//获取最小使用频率的最不常使用节点(不是指针)
				auto it2 = _freq_table[_minfreq].back();
				_key_table.erase(it2._key);
				_freq_table[_minfreq].pop_back();
				if (_freq_table[_minfreq].size()==0)
				{
					_freq_table.erase(_minfreq);
				}
			}
			_freq_table[1].push_front(LFUNode(key, val, 1));
			_key_table[key] = _freq_table[1].begin();
			_minfreq = 1;
		}
		else
		{
			list<LFUNode>::iterator pnode = it->second;
			int freq = pnode->_freq;
			_freq_table[freq].erase(pnode);
			if (_freq_table[freq].size()==0)
			{
				_freq_table.erase(freq);
				if (_minfreq == freq)
				{
					_minfreq += 1;
				}
			}
			_freq_table[freq + 1].push_front(LFUNode(key, val, freq + 1));
			_key_table[key] = _freq_table[freq + 1].begin();
		}
	}
};
举报

相关推荐

0 条评论