leecode更新

This commit is contained in:
markilue 2023-05-10 13:39:26 +08:00
parent 9eccd2abe2
commit fea6d3debc
4 changed files with 220 additions and 2 deletions

View File

@ -3,6 +3,8 @@ package com.markilue.leecode.hot100.second;
import com.sun.media.sound.RIFFInvalidDataException;
import org.junit.Test;
import java.util.LinkedList;
/**
*@BelongsProject: Leecode
*@BelongsPackage: com.markilue.leecode.hot100.second
@ -16,8 +18,8 @@ import org.junit.Test;
public class T23_42_Trap {
@Test
public void test(){
int[] height={0,1,0,2,1,0,1,3,2,1,2,1};
public void test() {
int[] height = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
System.out.println(trap(height));
}
@ -53,4 +55,28 @@ public class T23_42_Trap {
return sum;
}
//接雨水单调栈解法
public int trap1(int[] height) {
LinkedList<Integer> stack = new LinkedList<>();
int result = 0;
for (int i = 0; i < height.length; i++) {
while (!stack.isEmpty() && height[i] > height[stack.peek()]) {
Integer top = stack.pop();
if (stack.isEmpty()) {
break;//至少要两个才能有积水
}
Integer left = stack.peek();
int curWidth = i - left - 1;
int curHeight = Math.min(height[left], height[i])-height[top];
result += curHeight * curWidth;
}
stack.push(i);
}
return result;
}
}

View File

@ -171,4 +171,40 @@ public class T38_84_LargestRectangleArea {
}
//二刷:单调栈解法
public int largestRectangleArea4(int[] heights) {
int n = heights.length;
LinkedList<Integer> stack = new LinkedList<>();
int[] left = new int[n];
int[] right = new int[n];
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {//找第一个小于这个数的
stack.pop();
}
left[i] = stack.isEmpty() ? -1 : stack.peek();
stack.push(i);
}
stack.clear();
for (int i = n - 1; i >= 0; i--) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {//找第一个小于这个数的
stack.pop();
}
right[i] = stack.isEmpty() ? n : stack.peek();
stack.push(i);
}
int maxArea = Integer.MIN_VALUE;
//计算每一个位置最大矩形大小
for (int i = 0; i < heights.length; i++) {
maxArea = Math.max(maxArea, heights[i] * (right[i] - left[i] - 1));
}
return maxArea;
}
}

View File

@ -0,0 +1,38 @@
package com.markilue.leecode.hot100.second;
import com.markilue.leecode.listnode.ListNode;
/**
*@BelongsProject: Leecode
*@BelongsPackage: com.markilue.leecode.hot100.second
*@Author: markilue
*@CreateTime: 2023-05-10 11:26
*@Description: TODO 力扣142 环形链表II
*@Version: 1.0
*/
public class T54_142_DetectCycle {
//快慢指针:如果有环则一定相遇;如果相遇通过数学关系可以推出关系
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
//两者相遇
ListNode start = head;
while (start != fast) {
start = start.next;
fast = fast.next;
}
return start;
}
}
return null;//没找到
}
}

View File

@ -0,0 +1,118 @@
package com.markilue.leecode.hot100.second;
import java.util.HashMap;
/**
*@BelongsProject: Leecode
*@BelongsPackage: com.markilue.leecode.hot100.second
*@Author: markilue
*@CreateTime: 2023-05-10 11:42
*@Description: TODO 力扣146 LRU缓存
*@Version: 1.0
*/
public class T55_146_LRUCache {
HashMap<Integer, Node> map;
Node head;
Node tail;
int capacity;
public T55_146_LRUCache(int capacity) {
this.capacity = capacity;
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
map = new HashMap<>();
}
public int get(int key) {
Node node = map.get(key);
if (node == null) {
return -1;
}
deleteNode(node);
addToHead(node);
return node.val;
}
public void put(int key, int value) {
Node pre = map.get(key);
if (pre == null) {
if (map.size() == capacity) {
Node node = deleteTail();
map.remove(node.key);
}
Node node = new Node(key,value);
addToHead(node);
map.put(key, node);
} else {
pre.val = value;
deleteNode(pre);
addToHead(pre);
}
}
private Node deleteTail() {
Node delete = tail.pre;
deleteNode(tail.pre);
return delete;
}
//将节点加在头部
private void addToHead(Node node) {
node.next = head.next;
head.next.pre = node;
head.next = node;
node.pre = head;
}
//删除当前节点
private void deleteNode(Node node) {
node.next.pre = node.pre;
node.pre.next = node.next;
}
class Node {
Node pre;
Node next;
int val;
int key;
public Node() {
}
public Node(int key, int val) {
this.key = key;
this.val = val;
}
public Node(int key ,int val, Node pre, Node next) {
this.key = key;
this.val = val;
this.pre = pre;
this.next = next;
}
}
public static void main(String[] args) {
T55_146_LRUCache lRUCache = new T55_146_LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
System.out.println(lRUCache.get(1)); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废缓存是 {1=1, 3=3}
System.out.println(lRUCache.get(2)); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废缓存是 {4=4, 3=3}
System.out.println(lRUCache.get(1)); // 返回 -1 (未找到)
System.out.println(lRUCache.get(3)); // 返回 3
System.out.println(lRUCache.get(4)); // 返回 4
}
}