diff --git a/MCA算法突击课/第03期/mca_07/Code04_TopologicalSort.java b/MCA算法突击课/第03期/mca_07/Code01_TopologicalSort.java similarity index 98% rename from MCA算法突击课/第03期/mca_07/Code04_TopologicalSort.java rename to MCA算法突击课/第03期/mca_07/Code01_TopologicalSort.java index c37cedd..238d482 100644 --- a/MCA算法突击课/第03期/mca_07/Code04_TopologicalSort.java +++ b/MCA算法突击课/第03期/mca_07/Code01_TopologicalSort.java @@ -14,7 +14,7 @@ import java.io.StreamTokenizer; import java.util.ArrayList; import java.util.Arrays; -public class Code04_TopologicalSort { +public class Code01_TopologicalSort { public static int MAXN = 200001; diff --git a/MCA算法突击课/第03期/mca_07/Code05_Kruskal.java b/MCA算法突击课/第03期/mca_07/Code02_Kruskal.java similarity index 98% rename from MCA算法突击课/第03期/mca_07/Code05_Kruskal.java rename to MCA算法突击课/第03期/mca_07/Code02_Kruskal.java index ed94ca9..5e085a1 100644 --- a/MCA算法突击课/第03期/mca_07/Code05_Kruskal.java +++ b/MCA算法突击课/第03期/mca_07/Code02_Kruskal.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_Kruskal { +public class Code02_Kruskal { public static int MAXM = 100001; diff --git a/MCA算法突击课/第03期/mca_07/Code06_OptimizeWaterDistributionInVillage.java b/MCA算法突击课/第03期/mca_07/Code03_OptimizeWaterDistributionInVillage.java similarity index 97% rename from MCA算法突击课/第03期/mca_07/Code06_OptimizeWaterDistributionInVillage.java rename to MCA算法突击课/第03期/mca_07/Code03_OptimizeWaterDistributionInVillage.java index 9f00cf0..b429892 100644 --- a/MCA算法突击课/第03期/mca_07/Code06_OptimizeWaterDistributionInVillage.java +++ b/MCA算法突击课/第03期/mca_07/Code03_OptimizeWaterDistributionInVillage.java @@ -14,7 +14,7 @@ import java.util.Arrays; // 连接是双向的 // 请返回 为所有房子都供水的最低总成本 // 测试链接 : https://leetcode.cn/problems/optimize-water-distribution-in-a-village/ -public class Code06_OptimizeWaterDistributionInVillage { +public class Code03_OptimizeWaterDistributionInVillage { public static int MAXN = 10010; diff --git a/MCA算法突击课/第03期/mca_07/Code07_NetworkDelayTime.java b/MCA算法突击课/第03期/mca_07/Code04_NetworkDelayTime.java similarity index 96% rename from MCA算法突击课/第03期/mca_07/Code07_NetworkDelayTime.java rename to MCA算法突击课/第03期/mca_07/Code04_NetworkDelayTime.java index f5b3785..3f20b3f 100644 --- a/MCA算法突击课/第03期/mca_07/Code07_NetworkDelayTime.java +++ b/MCA算法突击课/第03期/mca_07/Code04_NetworkDelayTime.java @@ -6,7 +6,7 @@ import java.util.PriorityQueue; // Dijkstra算法 // leetcode 743题,可以用这道题来练习Dijkstra算法 // 测试链接 : https://leetcode.com/problems/network-delay-time -public class Code07_NetworkDelayTime { +public class Code04_NetworkDelayTime { public static int networkDelayTime(int[][] times, int n, int k) { ArrayList> nexts = new ArrayList<>(); diff --git a/MCA算法突击课/第03期/mca_07/Code05_MaximumFrequencyStack.java b/MCA算法突击课/第03期/mca_07/Code05_MaximumFrequencyStack.java new file mode 100644 index 0000000..11a703c --- /dev/null +++ b/MCA算法突击课/第03期/mca_07/Code05_MaximumFrequencyStack.java @@ -0,0 +1,54 @@ +package 第03期.mca_07; + +import java.util.ArrayList; +import java.util.HashMap; + +// 设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。 +// 实现 FreqStack 类: +// FreqStack() 构造一个空的堆栈。 +// void push(int val) 将一个整数 val 压入栈顶。 +// int pop() 删除并返回堆栈中出现频率最高的元素。 +// 如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。 +// 测试链接 : https://leetcode.cn/problems/maximum-frequency-stack/ +public class Code05_MaximumFrequencyStack { + + class FreqStack { + + // 出现的最大次数 + private int topTimes; + // 每层节点 + private HashMap> cntValues = new HashMap<>(); + // 每一个数出现了几次 + private HashMap valueTopTime = new HashMap<>(); + + public void push(int val) { + // 当前数词频+1 + valueTopTime.put(val, valueTopTime.getOrDefault(val, 0) + 1); + // 当前数是什么词频 5 7次 + int curTopTimes = valueTopTime.get(val); + if (!cntValues.containsKey(curTopTimes)) { + cntValues.put(curTopTimes, new ArrayList<>()); + } + ArrayList curTimeValues = cntValues.get(curTopTimes); + curTimeValues.add(val); + topTimes = Math.max(topTimes, curTopTimes); + } + + public int pop() { + // 最大词频的那一层的链表(动态数组) + ArrayList topTimeValues = cntValues.get(topTimes); + int ans = topTimeValues.remove(topTimeValues.size() - 1); + if (topTimeValues.size() == 0) { + cntValues.remove(topTimes--); + } + int times = valueTopTime.get(ans); + if (times == 1) { + valueTopTime.remove(ans); + } else { + valueTopTime.put(ans, times - 1); + } + return ans; + } + } + +} diff --git a/MCA算法突击课/第03期/mca_07/Code06_InsertDeleteGetRandom.java b/MCA算法突击课/第03期/mca_07/Code06_InsertDeleteGetRandom.java new file mode 100644 index 0000000..f928085 --- /dev/null +++ b/MCA算法突击课/第03期/mca_07/Code06_InsertDeleteGetRandom.java @@ -0,0 +1,52 @@ +package 第03期.mca_07; + +import java.util.HashMap; + +// 测试链接 : https://leetcode.com/problems/insert-delete-getrandom-o1/ +public class Code06_InsertDeleteGetRandom { + + public class RandomizedSet { + + private HashMap keyIndexMap; + private HashMap indexKeyMap; + private int size; + + public RandomizedSet() { + keyIndexMap = new HashMap(); + indexKeyMap = new HashMap(); + size = 0; + } + + public boolean insert(int val) { + if (!keyIndexMap.containsKey(val)) { + keyIndexMap.put(val, size); + indexKeyMap.put(size++, val); + return true; + } + return false; + } + + public boolean remove(int val) { + if (keyIndexMap.containsKey(val)) { + int deleteIndex = keyIndexMap.get(val); + int lastIndex = --size; + int lastKey = indexKeyMap.get(lastIndex); + keyIndexMap.put(lastKey, deleteIndex); + indexKeyMap.put(deleteIndex, lastKey); + keyIndexMap.remove(val); + indexKeyMap.remove(lastIndex); + return true; + } + return false; + } + + public int getRandom() { + if (size == 0) { + return -1; + } + int randomIndex = (int) (Math.random() * size); + return indexKeyMap.get(randomIndex); + } + } + +} diff --git a/MCA算法突击课/第03期/mca_07/ReadLine.java b/MCA算法突击课/第03期/mca_07/ReadLine.java new file mode 100644 index 0000000..7b44d56 --- /dev/null +++ b/MCA算法突击课/第03期/mca_07/ReadLine.java @@ -0,0 +1,19 @@ +package 第03期.mca_07; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class ReadLine { + + public static void main(String[] args) throws IOException { + System.out.println("请输入文本"); + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String line = null; + while ((line = in.readLine()) != null) { + System.out.println(line); + } + in.close(); + } + +}