466-82(3、146、215)

3. 无重复字符的最长子串

在这里插入图片描述

class Solution
{
public:
	int lengthOfLongestSubstring(string s)
	{
		if (s.size() == 0) return 0;

		unordered_set<char> look;
		int res = 0;
		int left = 0;

		for (int i = 0; i < s.size(); i++)
		{
			while (look.find(s[i]) != look.end())
			{
				look.erase(s[left]);
				left++;
			}
			res = std::max(res, i - left + 1);
			look.insert(s[i]);
		}
		return res;
	}
};

在这里插入图片描述

146. LRU 缓存

在这里插入图片描述

class LRUCache {
private:

    struct link_node
    {
        int key, value;
        link_node* pre;
        link_node* next;
        link_node() :key(0), value(0), pre(nullptr), next(nullptr) {}
        link_node(int _key, int _value)
            : key(_key), value(_value), pre(nullptr), next(nullptr) {}
    };

    unordered_map<int, link_node*> cache;
    link_node* dummy_head;
    link_node* dummy_tail;
    int size;
    int capacity;



public:
    LRUCache(int _capacity) : capacity(_capacity), size(0) {
        // 使用伪头部和伪尾部节点
        dummy_head = new link_node();
        dummy_tail = new link_node();
        dummy_head->next = dummy_tail;
        dummy_tail->pre = dummy_head;
    }

    int get(int key) {
        if (!cache.count(key))
            return -1;

        // 如果 key 存在,先通过哈希表定位,再移到头部
        link_node* node = cache[key];
        move_to_head(node);
        return node->value;
    }

    void put(int key, int value) {
        if (cache.count(key)) {
            //已经有节点key,就更新节点的value值
            link_node* node = cache[key];
            node->value = value;
            move_to_head(node);
        }
        else {
            link_node* node = new link_node(key, value);
            add_to_head(node);
            //添加进哈希表
            cache[key] = node;
            size++;
            if (size > capacity) {
                //如果超出容量,删除双向链表的尾部节点
                //先获得这个即将删除的节点
                link_node* removed = remove_tail();
                //删除哈希表中的对应项
                cache.erase(removed->key);
                delete removed;
                size--;
            }
        }
    }

    void add_to_head(link_node* node) {
        node->pre = dummy_head;
        node->next = dummy_head->next;
        dummy_head->next->pre = node;
        dummy_head->next = node;
    }

    void remove_node(link_node* node){
        node->pre->next = node->next;
        node->next->pre = node->pre;
    }

    void move_to_head(link_node* node) {
        remove_node(node);
        add_to_head(node);
    }

    //删除最尾部的节点
    //函数的意义:原表中已经删除了,返回需要删除的node节点
    link_node* remove_tail() {
        link_node* temp = dummy_tail->pre;
        remove_node(temp);
        return temp;
    }
};

在这里插入图片描述

215. 数组中的第K个最大元素

在这里插入图片描述

class Solution
{
	int Partation(vector<int>& arr, int l, int r)
	{
		int val = arr[l];

		while (l < r)
		{
			while (l < r && arr[r] > val)
			{
				r--;
			}

			if (l < r)
			{
				arr[l] = arr[r];
				l++;
			}

			while (l < r && arr[l] < val)
			{
				l++;
			}

			if (l < r)
			{
				arr[r] = arr[l];
				r--;
			}
		}
        arr[l] = val;
        return l;
	}

	void QuickSort(vector<int>& arr, int begin, int end)
	{
		if (begin >= end)
		{
			return;
		}

		int pos = Partation(arr, begin, end);
		QuickSort(arr, begin, pos - 1);
		QuickSort(arr, pos + 1, end);
	}

public:
	int findKthLargest(vector<int>& nums, int k)
	{
		int size = nums.size();
		QuickSort(nums, 0, size - 1);
		return nums[size - k];
	}
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值