算法篇06、其他算法补充--贪心算法、LRU缓存替换策略算法等
2024-01-19 18:32:31
哈喽,大家好,我是算法菌。
在上一篇文章中,我们学习了动态规划算法,相信大家已经掌握了动态规划算法的核心思想和一些经典问题。在本文中,我们将学习另外两种重要的算法:贪心算法和LRU缓存替换策略算法。
贪心算法是一种用于解决优化问题的算法,它每次都会做出在当前看来最好的选择,而不考虑未来的影响。贪心算法通常用于解决一些具有子最优性问题的优化问题,例如背包问题、旅行商问题等。
LRU缓存替换策略算法是一种用于管理缓存的算法,它会根据数据的最近使用情况来决定哪些数据应该被替换掉。LRU缓存替换策略算法通常用于解决一些需要对数据进行快速访问的场景,例如网页浏览、数据库缓存等。
1、leetcode455--分发饼干
leetcode455题目给定一个数组g[i],其中g[i]是第i个孩子的胃口大小,以及一个数组s[j],其中s[j]是第j块饼干的大小。每个孩子只能吃一块饼干,并且每个饼干只能被一个孩子吃。
设计一个算法,使得每个孩子都能吃到一块饼干,并且总的浪费最少(浪费被定义为饼干的大小与孩子胃口大小的差的绝对值)。
我们可以使用贪心算法来解决这个问题。首先,我们将孩子和饼干按胃口大小和饼干大小从小到大排序。然后,我们将每个孩子与一个饼干进行匹配,使得每个孩子的胃口大小都小于或等于饼干的大小。这样,我们就可以保证每个孩子都能吃到一块饼干,并且总的浪费最少。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i = 0;
int j = 0;
while (i < g.length && j < s.length) {
if (g[i] <= s[j]) {
i++;
j++;
} else {
j++;
}
}
return i;
}
}
2、leetcode146--LRU缓存机制
leetcode146题目:设计一个LRU缓存机制,它应该支持以下操作:获取数据get和写入数据put。
获取数据get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
我们可以使用双向链表和哈希表来实现LRU缓存机制。双向链表用于存储缓存的数据,哈希表用于快速查找数据。当我们需要获取数据时,我们首先在哈希表中查找数据。如果数据存在,我们将数据从双向链表中删除,并将其添加到双向链表的头部。如果数据不存在,我们将返回-1。
当我们需要写入数据时,我们首先在哈希表中查找数据。如果数据存在,我们将数据从双向链表中删除,并将其添加到双向链表的头部。如果数据不存在,我们将创建一个新的节点,并将其添加到双向链表的头部。如果此时双向链表的长度大于缓存容量,我们将从双向链表的尾部删除一个节点。
class LRUCache {
private int capacity;
private Map<Integer, Node> map;
private Node head;
private Node tail;
public LRUCache(int capacity) {
this.capacity = capacity;
this.map = new HashMap<>();
this.head = new Node(0, 0);
this.tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
}
public int get(int key) {
if (!map.containsKey(key)) {
return -1;
}
Node node = map.get(key);
removeNode(node);
addNodeToHead(node);
return node.value;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
Node node = map.get(key);
removeNode(node);
}
Node node = new Node(key, value);
addNodeToHead(node);
map.put(key, node);
if (map.size() > capacity) {
Node