经典算法与题目对应列表:https://leetcode.cn/circle/discuss/bawPH2/

文章目录

  • 排序([LC-912. 排序数组](https://leetcode.cn/problems/sort-an-array/))
    • 插入排序
      • 直接插入排序
      • 折半插入排序
      • 希尔排序
    • 交换排序
      • 冒泡排序
      • 快速排序【重要】
    • 选择排序
      • 简单选择排序
      • 堆排序【重要】
    • 归并排序【重要】
    • 基数排序
  • 二分查找([35. 搜索插入位置](https://leetcode.cn/problems/search-insert-position/))
  • 字符串KMP算法([28. 找出字符串中第一个匹配项的下标](https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/))
  • 二叉树
    • 中序遍历非递归([94. 二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/))
    • 后序遍历非递归([145. 二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/))
    • 层序遍历([515. 在每个树行中找最大值](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/))
  • 图论
    • 图遍历算法
      • BFS(宽度搜索算法)([1091. 二进制矩阵中的最短路径](https://leetcode.cn/problems/shortest-path-in-binary-matrix/))
    • Dijkstra单源最短路径([743. 网络延迟时间](https://leetcode.cn/problems/network-delay-time/))
    • 最小生成树算法([1584. 连接所有点的最小费用](https://leetcode.cn/problems/min-cost-to-connect-all-points/))
      • Prim算法(选节点)
      • Kruskal算法(选边)
    • 拓扑排序([207. 课程表](https://leetcode.cn/problems/course-schedule/))

排序(LC-912. 排序数组)

图片来源:https://visualgo.net/en/sorting

给你一个整数数组 nums,请你将该数组升序排列。

插入排序

直接插入排序

class Solution {public int[] sortArray(int[] nums) {int n = nums.length; int j;for(int i = 1; i < n; i++){int k = nums[i];for(j = i-1; j >= 0 && nums[j] > k; j--){nums[j+1] = nums[j];}nums[j+1] = k;}return nums;}
}

折半插入排序

class Solution {public int[] sortArray(int[] nums) {int n = nums.length;for(int i = 1; i < n; i++){int k = nums[i];int left = 0, right = i;while(left < right){int mid = (left + right) >> 1;if(nums[mid] > k) right = mid;else left = mid + 1;}for(int j = i-1; j >= right; j--)nums[j+1] = nums[j];nums[right] = k;}return nums;}
}

希尔排序

希尔.gif

希尔排序 - 插入排序的改进版。为了减少数据的移动次数,在初始序列较大时取较大的步长,通常取序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素时数据移动的次数会相对较少,效率得到了提高。

class Solution {public int[] sortArray(int[] nums) {int j;int n = nums.length;for(int d = n/2; d >= 1; d = d/2){ //步长5 3 1for(int i = d; i < n; i++){ //从步长开始遍历int tmp = nums[i];//(直接插入排序)注意就j = j- d;for(j = i - d;j >= 0 && nums[j] > tmp; j -= d){nums[j+d] = nums[j];}nums[j+d] = tmp;}}return nums;}
}

交换排序

冒泡排序

class Solution {public int[] sortArray(int[] nums) {int n = nums.length;for(int i = 0; i < n-1; i++){boolean isexchange = false;for(int j = n-1; j > i; j--){if(nums[j-1] > nums[j]){isexchange = true;swap(nums, j-1, j);}}if(isexchange == false) break; // 已经有序}return nums;}public void swap(int[] nums, int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

https://pic.leetcode-cn.com/1662538438-KKAVSu-%E5%BF%AB%E6%8E%92.gif

快速排序【重要】

class Solution {public int[] sortArray(int[] nums) {quickSort(nums, 0, nums.length-1);return nums;}public void quickSort(int[] nums, int low, int high){if(low < high){int pivot = Partition(nums, low, high);quickSort(nums, low, pivot-1);quickSort(nums, pivot+1, high);}}public int Partition(int[] nums, int low, int high){int pivot = nums[low];while(low < high){while(low < high && nums[high] >= pivot) high--;nums[low] = nums[high];while(low < high && nums[low] <= pivot) low++;nums[high] = nums[low];}nums[low] = pivot; // 最终位置在low = high; return low;}
}

选择排序

简单选择排序

class Solution {public int[] sortArray(int[] nums) {int n = nums.length;for(int i = 0; i < n; i++){int k = i;for(int j = i+1; j < n; j++){if(nums[k] > nums[j]) k = j;}swap(nums, i, k);}return nums;}public void swap(int[] nums, int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

堆排序【重要】

https://leetcode.cn/problems/sort-an-array/solution/javacha-ru-dui-gui-bing-kuai-pai-dui-shu-dm56/

思路:

将无序序列构建成一个堆,根据本题要求构建成大顶堆

将堆顶与末尾元素进行交换,将最大元素沉到数组末尾

重新调整结构,使其满足堆的定义,然后继续交换堆顶与数组末尾元素,反复执行调整+交换,直至整个数组有序

class Solution {public int[] sortArray(int[] nums) {// 重建大根堆for(int i = nums.length/2-1; i >= 0; i--){adjustHeap(nums, i, nums.length);}for(int i = nums.length-1; i > 0; i--){ //n-1趟交换swap(nums, i, 0); //输出堆顶元素adjustHeap(nums, 0, i);}return nums;}// 将元素位置为i的根的子树进行调整 public void adjustHeap(int[] arr, int idx, int length){int tmp = arr[idx];for(int k = idx*2+1; k < length; k = k*2 + 1){if(k+1 < length && arr[k] < arr[k+1]){k++; //找到key较大的子节点在下面进行比较}if(arr[k] > tmp){arr[idx] = arr[k]; //将arr[i]调整到双亲上idx = k; //继续向下调整 }else{break; // 已经满足根>左右}}arr[idx] = tmp;}public void swap(int[] nums, int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

①假定数组初始顺序如下
image.png
②从最后一个非叶子节点6开始调整
image.png
③向上调整上一个非叶子节点4
image.png
④调整完成后造成以4为根节点的堆结构混乱,继续调整
image.png
⑤将堆顶元素9与末尾元素4交换
image.png
⑥重新调整结构,此时调整的是[4,6,8,5]的结构
image.png
⑦再将堆顶元素8与末尾元素5进行交换,得到第二大元素8
image.png
⑧后续继续进行调整交换,直至整个数组有序
image.png

归并排序【重要】

归并排序是利用归并的思想实现的排序方法,先将数组递归分解,再对分解后的两个数组进行比较合并

class Solution {public int[] sortArray(int[] nums) {mergesort(nums, 0, nums.length-1);return nums;}public void mergesort(int[] nums, int left, int right){if(right <= left) return ;int mid = (left + right) / 2;//分解数组mergesort(nums, left, mid);mergesort(nums, mid+1, right);// 合并数组merge(nums, left, mid, right);}public void merge(int[] nums, int left, int mid, int right){int[] tmp = new int[right - left + 1];int i = left, j = mid + 1, k = 0;while(i <= mid && j <= right){tmp[k++] = nums[i] < nums[j] ? nums[i++] : nums[j++];}while(i <= mid) tmp[k++] = nums[i++];while(j <= right) tmp[k++] = nums[j++];//将排序后的temp数组合并至原数组对应的索引部分for(int index = 0; index < tmp.length; index++) {nums[left + index] = tmp[index];}}
}

image.png


基数排序

基数排序.png

题解+代码:https://leetcode.cn/problems/sort-an-array/solution/fu-xi-ji-chu-pai-xu-suan-fa-java-by-liweiwei1419/

class Solution {private static final int OFFSET = 50000;public int[] sortArray(int[] nums) {int len = nums.length;// 预处理,让所有的数都大于等于 0,这样才可以使用基数排序for (int i = 0; i < len; i++) {nums[i] += OFFSET;}// 第 1 步:找出最大的数字int max = nums[0];for (int num : nums) {if (num > max) max = num;}// 第 2 步:计算出最大的数字有几位,这个数值决定了我们要将整个数组看几遍int maxLen = getMaxLen(max);// 计数排序需要使用的计数数组和临时数组int[] count = new int[10];int[] temp = new int[len];// 表征关键字的量:除数// 1 表示按照个位关键字排序// 10 表示按照十位关键字排序// 100 表示按照百位关键字排序// 1000 表示按照千位关键字排序int divisor = 1;// 有几位数,外层循环就得执行几次for (int i = 0; i < maxLen; i++) {// 每一步都使用计数排序,保证排序结果是稳定的// 这一步需要额外空间保存结果集,因此把结果保存在 temp 中countingSort(nums, temp, divisor, len, count);// 交换 nums 和 temp 的引用,下一轮还是按照 nums 做计数排序int[] t = nums;nums = temp;temp = t;// divisor 自增,表示采用低位优先的基数排序divisor *= 10;}int[] res = new int[len];for (int i = 0; i < len; i++) {res[i] = nums[i] - OFFSET;}return res;}private void countingSort(int[] nums, int[] res, int divisor, int len, int[] count) {// 1、计算计数数组for (int i = 0; i < len; i++) {// 计算数位上的数是几,先取个位,再十位、百位int remainder = (nums[i] / divisor) % 10;count[remainder]++;}// 2、变成前缀和数组for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 3、从后向前赋值for (int i = len - 1; i >= 0; i--) {int remainder = (nums[i] / divisor) % 10;int index = count[remainder] - 1;res[index] = nums[i];count[remainder]--;}// 4、count 数组需要设置为 0 ,以免干扰下一次排序使用for (int i = 0; i < 10; i++) {count[i] = 0;}}private int getMaxLen(int num) {int maxLen = 0;while (num > 0) {num /= 10;maxLen++;}return maxLen;}
}

二分查找(35. 搜索插入位置)

①左闭右闭

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length-1;while(left <= right){int mid = (left + right) >> 1;if(nums[mid] == target) return mid;else if(nums[mid] < target) left = mid+1;else right = mid-1;}return left;}
}

②左闭右开

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length;while(left < right){int mid = (left + right) >> 1;if(nums[mid] == target) return mid;else if(nums[mid] < target) left = mid+1;else right = mid;}return left;}
}

字符串KMP算法(28. 找出字符串中第一个匹配项的下标)

class Solution {// KMP算法(在s字符串中找t字符串的起始位置)public int strStr(String s, String t) {int[] next = get_next(t);int i = 0, j = 0;while(i < s.length() && j < t.length()){if(j == -1 || s.charAt(i) == t.charAt(j)){//当 j=0 时,也让主串i移动i++; j++;// 继续比较后继字符}else{j = next[j]; // 模式串向左移动 }}if(j == t.length()) return i - t.length();else return -1;}// next数组:当发生不匹配时,j应该回到的位置(注意是对模式串(目标串)构建next数组)public int[] get_next(String t){int[] next = new int[t.length()+1];int i = 0, j = -1;next[0] = -1;while(i < t.length()){if(j == -1 || t.charAt(i) == t.charAt(j)){i++; j++;next[i] = j;// 若pi = pj,则next[j+1] = next[j]+1}else{j = next[j];}}return next;}
}

二叉树

中序遍历非递归(94. 二叉树的中序遍历)

建立一个栈,遍历节点p=root

根结点进栈,遍历左子树

根结点出栈,输出根结点,遍历右子树

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode p = root; // p指针遍历,初始指向根节点while(p != null || !stack.isEmpty()){if(p != null){stack.push(p);p = p.left;}else{ // p 为空时,遍历到最左下了p = stack.pop(); // 弹出元素并访问res.add(p.val);p = p.right; // 遍历右子树}}return res;}
}

中序遍历递归方式:

class Solution {List<Integer> res;public List<Integer> inorderTraversal(TreeNode root) {res = new ArrayList<>();if(root == null) return res;dfs(root);return res;}public void dfs(TreeNode node){if(node == null) return;dfs(node.left);res.add(node.val);dfs(node.right);}
}

后序遍历非递归(145. 二叉树的后序遍历)

后序遍历二叉树是先访问左子树,再访问右子树,最后访问根结点。

算法思想:

  1. 先沿根结点,依次入栈,直到左孩子为空
  2. 读取栈顶元素;如果其右孩子不空且未被访问过,将右子树转执行 1;
  3. 否则,栈顶元素出栈并访问。
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode p = root; // p指针遍历,初始指向根节点TreeNode pre = null; // pre前驱指针while(p != null || !stack.isEmpty()){if(p != null){ //走到最左边 stack.push(p);p = p.left;}else{p = stack.peek(); // 读取栈顶节点if(p.right != null && p.right != pre){ //若右子树存在,且未被访问过 p = p.right; // 访问右子树}else{ //否则弹出结点并访问 p = stack.pop();res.add(p.val);pre = p; // 记录最近访问的结点 p = null; // 结点访问完后,重置p指针}}}return res;}
}

后序遍历递归方式:

class Solution {List<Integer> res;public List<Integer> postorderTraversal(TreeNode root) {res = new ArrayList<>();if(root == null) return res;dfs(root);return res;}public void dfs(TreeNode node){if(node == null) return;dfs(node.left);dfs(node.right);res.add(node.val);}
}

层序遍历(515. 在每个树行中找最大值)

class Solution {public List<Integer> largestValues(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null) return res;Deque<TreeNode> dq = new ArrayDeque<>();dq.addLast(root);while(!dq.isEmpty()){int size = dq.size();int max = Integer.MIN_VALUE;while(size-- > 0){TreeNode cur = dq.pollFirst();max = Math.max(max, cur.val);if(cur.left != null) dq.addLast(cur.left);if(cur.right != null) dq.addLast(cur.right);}res.add(max);}return res;}
}

图论

图遍历算法

BFS(宽度搜索算法)(1091. 二进制矩阵中的最短路径)

class Solution {int[][] dict = {{0, 1}, {0, -1}, {1, 0}, {-1, 0},{1, 1},{1, -1}, {-1, 1}, {-1, -1}};public int shortestPathBinaryMatrix(int[][] grid) {int m = grid.length, n = grid[0].length;boolean[][] visit = new boolean[m][n];int res = 1;Deque<int[]> dq = new ArrayDeque<>();if(grid[0][0] == 1) return -1;if(m == 1 && n == 1) return 1;dq.addLast(new int[]{0, 0});visit[0][0] = true;while(!dq.isEmpty()){int size = dq.size();res++;while(size-- > 0){int[] pos = dq.pollFirst();for(int[] d : dict){int nx = pos[0] + d[0], ny = pos[1] + d[1];if(nx >= 0 && nx < m && ny >= 0 && ny < n && !visit[nx][ny] && grid[nx][ny] == 0){if(nx == m-1 && ny == n-1) return res;visit[nx][ny] = true;dq.addLast(new int[]{nx, ny});}}}}return -1;}
}

Dijkstra单源最短路径(743. 网络延迟时间)

https://leetcode.cn/problems/network-delay-time/solution/gtalgorithm-dan-yuan-zui-duan-lu-chi-tou-w3zc/

单源最短路问题可以使用 Dijkstra 算法,其核心思路是贪心算法。流程如下:

  1. 首先,Dijkstra 算法需要从当前全部未确定最短路的点中,找到距离源点最短的点x。
  2. 其次,通过点x更新其他所有点距离源点的最短距离。例如目前点 A 距离源点最短,距离为 3;有一条 A->B 的有向边,权值为 1,那么从源点先去 A 点再去 B 点距离为 3 + 1 = 4,若原先从源点到 B 的有向边权值为 5,那么我们便可以更新 B 到源点的最短距离为 4
  3. 当全部其他点都遍历完成后,一次循环结束,将 x标记为已经确定最短路。进入下一轮循环,直到全部点被标记为确定了最短路。
class Solution {private static final int INF = Integer.MAX_VALUE/2;public int networkDelayTime(int[][] times, int n, int k) {// 邻接矩阵存储边信息int[][] g = new int[n][n];for(int i = 0; i < n; i++){Arrays.fill(g[i], INF); // 初始化路径不可达}for(int[] t : times){int x = t[0]-1, y = t[1]-1; // 边序号从0开始g[x][y] = t[2];}int[] dist = new int[n]; // 从源点到某点的距离数组Arrays.fill(dist, INF);dist[k-1] = 0; // 由于从 k 开始,所以该点距离设为 0,也即源点boolean[] used = new boolean[n]; // 节点是否被更新数组for(int i = 0; i < n; i++){// 在还未确定最短路的点中,寻找距离最小的点int x = -1;for(int y = 0; y < n; y++){if(!used[y] && (x == -1 || dist[y] < dist[x])){x = y;}}used[x] = true; // 用该点更新所有其他点的距离for(int y = 0; y < n; y++){dist[y] = Math.min(dist[y], dist[x] + g[x][y]);}}// 找到距离最远的点int ans = Arrays.stream(dist).max().getAsInt();return ans == INF ? -1 : ans;}
}

最小生成树算法(1584. 连接所有点的最小费用)

题解:https://leetcode.cn/problems/min-cost-to-connect-all-points/solution/1584-lian-jie-suo-you-dian-de-zui-xiao-f-i12e/

图来源:https://leetcode.cn/problems/min-cost-to-connect-all-points/solution/prim-and-kruskal-by-yexiso-c500/

Prim算法(选节点)

Prim 算法也使用贪心思想来让生成树的权重尽可能小,也就是切分定理。

切分定理:对于任意一种切分,其中权重最小的那条横切边一定是构成最小生成树的一条边

Prim算法先以某一个点进行切分,然后找到它权重最小的边及邻点,将其加入最小生成树集合MST,然后再以这两个点进行切分…

每次切分都能找到最小生成树的一条边,然后又可以进行新一轮切分,直到找到最小生成树的所有边为止

同时用一个布尔数组 inMST 辅助,防止重复计算横切边

可以用一个优先级队列存储这些横切边,就可以动态计算权重最小的横切边了

class Solution {public int minCostConnectPoints(int[][] points) {// 转化成无向图邻接表的形式List<int[]>[] graph = buildGraph(points);// 执行 Prim 算法Prim prim = new Prim(graph);return prim.minWeightSum;}// 转化成无向图邻接表的形式public List<int[]>[] buildGraph(int[][] points){int n = points.length;List<int[]>[] graph = new List[n];for(int i = 0; i < n; i++) graph[i] = new ArrayList<>();for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){int x1 = points[i][0], y1 = points[i][1];int x2 = points[j][0], y2 = points[j][1];int dis = Math.abs(x1 - x2) + Math.abs(y1 - y2); // 用 points 中的索引表示坐标点// 无向图其实就是双向图// 一条边表示为 int[]{from, to, weight}graph[i].add(new int[]{i, j, dis});graph[j].add(new int[]{j, i, dis});}}return graph;}class Prim{// 核心数据结构,存储横切边的优先级队列// 按照边的权重从小到大排序PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> (a[2] - b[2]));// 类似 visited 数组的作用,记录哪些节点已经成为最小生成树的一部分boolean[] inMST;int minWeightSum = 0; // 记录最小生成树的权重和// graph 是用邻接表表示的一幅图,graph[s] 记录节点 s 所有相邻的边,// 三元组 int[]{from, to, weight} 表示一条边List<int[]>[] graph;public Prim(List<int[]>[] graph){this.graph = graph;inMST = new boolean[graph.length];cnt(0); // 随便从一个点开始切分都可以,从节点 0 开始inMST[0] = true;// 不断进行切分,向最小生成树中添加边while(!pq.isEmpty()){int[] edge = pq.poll();int to = edge[1], weight = edge[2];if(inMST[to]){// 节点 to 已经在最小生成树中,跳过,否则这条边会产生环continue;}// 将边 edge 加入最小生成树cnt(to); // 节点 to 加入后,进行新一轮切分,会产生更多横切边inMST[to] = true;minWeightSum += weight;}}// 将 s 的横切边加入优先队列public void cnt(int v){for(int[] edge : graph[v]){// 相邻接点 to 已经在最小生成树中,跳过,否则这条边会产生环if(inMST[edge[1]])  continue;// 加入横切边队列pq.add(edge);}}}}

image.png


Kruskal算法(选边)

Kruskal 算法需要用到 Union-Find 并查集算法

Kruskal 算法的一个难点是保证生成树的合法性,生成的树不能包含环,而 Union-Find 算法就擅长这个

对于添加的某条边,如果该边的两个节点本来就在同一连通分量里,那么添加这条边会产生环;反之,如果该边的两个节点不在同一连通分量里,则添加这条边不会产生环。

为了得到的这棵生成树是权重和最小的,用到了贪心思路:

将所有边按照权重从小到大排序,从权重最小的边开始遍历,如果这条边和 mst 中的其它边不会形成环,则这条边是最小生成树的一部分,将它加入 mst 集合;否则,这条边不是最小生成树的一部分,不要把它加入 mst 集合。

本题小技巧:每个坐标点是一个二元组,那么按理说应该用五元组表示一条带权重的边,但这样的话不便执行 Union-Find 算法;所以用 points 数组中的索引代表每个坐标点。

class Solution {public int minCostConnectPoints(int[][] points) {int n = points.length;// 生成所有边及权重ArrayList<int[]> edges = new ArrayList<>();for(int i = 0; i < n; i++){// ⭐注意j从i+1开始,不要重头开始,避免重复for(int j = i+1; j < n; j++){int x1 = points[i][0], y1 = points[i][1];int x2 = points[j][0], y2 = points[j][1];int dis = Math.abs(x1 - x2) + Math.abs(y1 - y2);edges.add(new int[]{i, j, dis});}}// 将边按照权重从小到大排序Collections.sort(edges, (a, b) -> (a[2] - b[2]));// 执行 Kruskal 算法UnionFind uf = new UnionFind(n);int minWeight = 0;for(int[] edge : edges){int i = edge[0], j = edge[1], weight = edge[2];// 如果i和j属于同一集合中,说明不能连接这条边,会产生环,不能加入mstif(uf.isConnected(i, j)) continue;// 若这条边不会产生环,则属于最小生成树uf.union(i, j);minWeight += weight;}return minWeight;}
}class UnionFind{private int count;private int[] parent;public UnionFind(int n){parent = new int[n];count = 0;for(int i = 0; i < n; i++) parent[i] = i;}public void union(int x, int y){int rootx = find(x);int rooty = find(y);parent[rootx] = rooty;// 两个连通分量合并成一个连通分量,count数量减一count--;}public int find(int x){if(parent[x] != x){parent[x] = find(parent[x]);}return parent[x];}// 返回两者是否属于同一连通分量public boolean isConnected(int x, int y){return find(x) == find(y);}public int getCount(){ return count;}
}

image.png


拓扑排序(207. 课程表)

题解:https://leetcode.cn/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/

算法流程:

  1. 统计课程安排图中每个节点的入度,生成 入度表 indegrees

  2. 借助一个队列 queue,将所有入度为 0 的节点入队。

  3. 当queue非空时,依次将队首节点出队,在课程安排图中删除此节点pre:

    • 并不是真正从邻接表中删除此节点 pre,而是将此节点对应所有邻接节点 cur 的入度 −1,即 indegrees[cur] -= 1

    • 当入度 −1后邻接节点 cur 的入度为 0,说明 cur 所有的前驱节点已经被 “删除”,此时将 cur 入队。

  4. 在每次pre出队时,执行numCourses–;

    • 若整个课程安排图是有向无环图(即可以安排),则所有节点一定都入队并出队过,即完成拓扑排序。换个角度说,若课程安排图中存在环,一定有节点的入度始终不为 00。

    • 因此,拓扑排序出队次数等于课程个数,返回 numCourses == 0 判断课程是否可以成功安排。

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] indegre = new int[numCourses]; // 记录每个节点的入度List<Integer>[] g = new ArrayList[numCourses];for(int i = 0; i < numCourses; i++) g[i] = new ArrayList<>();// 建图,获取每个节点的入度for(int[] p : prerequisites){indegre[p[0]]++; // p1 -> p0 有条边g[p[1]].add(p[0]);}// 队列里存放入度为0的节点Queue<Integer> queue = new LinkedList<>();for(int i = 0; i < numCourses; i++){if(indegre[i] == 0) queue.add(i);}// BFS遍历过程while(!queue.isEmpty()){int pre = queue.poll();numCourses--;for(int nxt : g[pre]){// 如果减去pre入度后的节点 入度为0,则可以执行该课程if(--indegre[nxt] == 0) queue.add(nxt);}}return numCourses == 0; // 判断是否所有课程都学习了}
}
经典基础算法总结(排序、二分、KMP、树、图)

相关文章

  1. Git统计项目成员代码提交量

    目录 一、前言 二、Git Bash 三、统计信息 1.统计某项目中成员数量 2.统计所有用户的提交总次数 3.统计所有用户指定时间段的提交次数 4.按用户名统计提交次数 完整脚本如下 一、前言 项目中有很多成员&#xff0c;如何查看各个时间段每个组员的代码提交量&#xff0c;下…...

    2023/3/28 17:11:01
  2. Vue实现单页缓存,下一页刷新

    vue单页缓存实现方案分析 实现前进刷新&#xff0c;返回不刷新的功能&#xff0c;并且返回时可以记住上一页的滚动位置&#xff0c;有两套方案可选 方案一&#xff1a;vue的keep-alive组件 具体使用如下&#xff1a; <keep-alive max"10"><router-view…...

    2023/3/28 17:09:36
  3. Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…...

    2023/3/28 17:03:43
  4. vscode搭建Django环境五:vscode配置react开发环境

    1、安装node 请在官网下载安装&#xff1a;https://nodejs.org/zh-cn/vscode 中新建终端输入指令node -v&#xff0c;能显示版本号&#xff0c;说明 node 已经装好了输入指令npm -v&#xff0c;能显示版本号&#xff0c;说明 npm 可以使用了 nodejs安装参考&#xff1a;https…...

    2023/3/28 17:03:28
  5. TiDB入门篇-数据物理备份和恢复

    简介 快照备份是集群全量备份的一种实现。它基于 TiDB 的多版本并发控制 (MVCC) 实现&#xff0c;将指定快照包含的所有数据备份到目标存储中。备份下来的数据大小约等于集群&#xff08;压缩后的&#xff09;单副本数据大小。备份完成之后&#xff0c;你可以在一个空集群或不…...

    2023/3/28 17:02:48
  6. 电脑录屏怎么录?超详细的录屏教程来了

    案例&#xff1a;电脑录屏怎么录&#xff1f;求详细的电脑录屏教程&#xff01; “最近的工作需要用到电脑录屏&#xff0c;但是我不知道电脑录屏怎么录&#xff1f;去网上搜索了一下教程都是比较大概的&#xff0c;我这个新手小白根本看不懂。在这里想问问大家&#xff0c;有…...

    2023/3/28 17:02:09
  7. 从0使用TCP手撸http服务器一

    背景介绍&#xff1a; 成熟的http服务器框架非常多&#xff0c;例如SB,flask,.net.....这些框架基本上都是运行在操作系统之上&#xff0c;非常的高级。但是我们做嵌入式的望尘莫及&#xff01;当然如果是linux的设备&#xff0c;可能还能用上轻量级的http服务器框架&#xff0…...

    2023/3/28 17:01:16
  8. Linux- 浅谈ELF目标文件格式

    理解了进程的描述和创建之后&#xff0c;自然会想到我们编写的可执行程序是如何作为一个进程工作的&#xff1f;这就涉及可执行文件的格式、编译、链接和装载等相关知识。 这里先提一个常见的名词“目标文件”&#xff0c;是指编译器生成的文件。“目标”指目标平台&#xff0c…...

    2023/3/28 16:59:58
  9. 2022(二等奖)C859基于WebGIS的南京市排污口管理系统

    作品介绍 一、需求分析 &#xff08;一&#xff09;社会需求 《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》明确提出&#xff0c;入河入海排污口(以下简称排污口&#xff09;是指直接或通过管道、沟、渠等排污通道向环境水体排放污水的口门&#xff0c;是流…...

    2023/3/28 16:58:54
  10. MobTech|场景唤醒的实现

    什么是场景唤醒&#xff1f; 场景唤醒是moblink的一项核心功能&#xff0c;可以实现从打开的Web页面&#xff0c;一键唤醒App&#xff0c;并恢复对应的场景。 场景是指用户在App内的某个特定页面或状态&#xff0c;比如商品详情页、活动页、个人主页等。每个场景都有一个唯一…...

    2023/3/28 16:57:55
  11. echarts 关系调用高亮示例 dispatchAction及其遇到的问题

    如图所示 <template><div class"Chart"><div class"main_box"><div class"diagram_box" v-if"activeChart diagram"><div class"drawer"><drawer:drawer.sync"drawer":cusStyl…...

    2023/3/28 16:56:33
  12. L1-018 大笨钟 L1-020 帅到没朋友 L1-034 点赞

    微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&#xff0c;所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的&#xff0c;如果正好在某个整点敲&#xff0c;那么“当”数就等于那个整点数&#xff…...

    2023/3/28 16:55:06
  13. 两个数组的交集(力扣刷题)

    给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-arrays 说…...

    2023/3/28 16:54:40
  14. 【HashMap】jdk1.8中HashMap的插入扩容源码学习分析

    jdk1.8中HashMap的插入扩容源码学习分析 一、成员变量 首先介绍HashMap中各个成员变量的作用&#xff0c;在HashMap中有以下成员变量 size记录了HashMap中键值对的个数 loadFactor&#xff08;加载因子&#xff09;用来决定size达到容量的百分之多少时触发扩容机制 默认是0…...

    2023/3/28 16:53:02
  15. uni-app css尺寸单位rpx介绍

    一&#xff0c;前言 1.在使用uni-app开发小程序时支持的尺寸单位如下 &#xff08;1&#xff09;基础单位&#xff1a;px &#xff0c; rpx &#xff08;2&#xff09;h5单位&#xff1a;rem &#xff0c;vm &#xff0c;vh 2.rpx是微信小程序提出的一种响应式px 二&#x…...

    2023/3/28 16:52:49
  16. 纳瓦尔的推荐读物

    非虚构类 《无穷的开始&#xff1a;世界进步的本源》&#xff0c;戴维多伊奇这本书不是很好理解&#xff0c;但确实让我变得更聪明了。 《人类简史&#xff1a;从动物到上帝》&#xff0c;尤瓦尔赫拉利这本书介绍了人类的历史。书中的观察、框架和心智模型会让你以不同的方式看…...

    2023/3/28 16:50:33
  17. 【JavaScript】43_DOM编程:DOM修改与demo

    10、DOM的修改 appendChild() 用于给一个节点添加子节点 list.appendChild(li) insertAdjacentElement() 可以向元素的任意位置添加元素 两个参数&#xff1a; 1.要添加的位置 2.要添加的元素 beforeend 标签的最后 afterbegin 标签的开始 beforebegin 在元素的前边插…...

    2023/3/28 16:50:09
  18. Ubuntu下解决 ×.so.×: wrong ELF class: ELFCLASS64 的问题

    安装软件时出现问题 .so.:wrong ELF class: ELFCLASS64 &#xff0c;大致的意思是软件是32位的&#xff0c;需要32位的 .so.动态链接库&#xff0c;而系统是64位的所提供的该 动态链接库.so.是64位的&#xff0c;所以不能用。 首先可以查看自己的64位系统是否开启了32位支持功…...

    2023/3/28 16:48:11
  19. [学习笔记]PowerBI数据分析与可视化-B站数据大白

    参考资料 B站视频-Power BI 数据分析与可视化 前言 原视频中可能的勘误在笔记中有修改。CtrlF搜索“勘误”两个字可以快速定位到勘误。 原视频中可能的差异在笔记中有提及。CtrlF搜索“差异”两个字可以快速定位到勘误。 2. 建模与DAX函数 2.01 建立关系模型 表可以分为维…...

    2023/3/28 16:47:41
  20. 如何进行安全可靠的API身份验证?

    前言&#xff1a; 在开发安全的 REST API 时&#xff0c;身份验证是必不可少的。你可以将你的应用程序想象成一个聚会&#xff0c;那么身份验证就像一扇门&#xff0c;决定哪些客人可以进入——或者更准确地说&#xff0c;哪些请求可以进出。 接下来我将介绍四种常用的身份验证…...

    2023/3/28 16:46:37
  21. Python机器学习1

    机器学习现在很火的&#xff0c;纯纯的行业红海&#xff0c;虽然我已经脱离计算机行业了&#xff0c;但是我觉得&#xff0c;机器学习还是有必要学一下的&#xff0c;说不定以后会用的上呢&#xff0c;所以&#xff0c;乘着现在研一时间还比较多&#xff0c;除了自己研究方向以…...

    2023/3/28 16:46:05
  22. 局部变量被莫名的改变如何处理

    问题背景&#xff1a; 一个函数内部的局部变量 初始化 X0&#xff0c;然后中间X 。再去访问时&#xff0c;X还是0&#xff1b; 伪代码 function A {int x0;int buff[4096];int tx[4096];....;;;; for() {x....if(x 1){.........}function B(buff)function C()......} } 原本…...

    2023/3/28 16:45:51
  23. 基于springboot实现财务管理系统【源码+论文】分享

    基于springboot实现财务管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xf…...

    2023/3/28 16:44:52
  24. KEYSIGHT DAQ970A/是德科技DAQ970A数据采集器

    产品概览 KEYSIGHT / AGILENT DAQ970A 数据采集系统 Keysight DAQ970A 是下一代数据采集 (DAQ) 系统&#xff0c;具有 3 插槽主机和 8 个插件模块供您选择。DAQ970A 具有 6 位&#xff08;22 位&#xff09;分辨率、0.004% 基本 dcV 精度和超低读取噪声。内部自动量程 DMM 直…...

    2023/3/28 16:44:04
  25. CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理

    作者&#xff1a;林苍 背景 容器无疑已经成为新的云计算基础设施&#xff0c;企业私有云平台的建设重心&#xff0c;正在从虚拟化的计算、存储、网络的建设&#xff0c;转向构建以容器、微服务等为核心的云原生平台。不过值得注意的是&#xff0c;企业 IT 系统在进行容器化改造…...

    2023/3/28 16:43:23
  26. linux 内存泄漏排查--多种工具介绍

    目录 1.工具 2.valgrind 2.1.Valgrind 安装 2.2.valgrind 使用 2.3.valgrind常见的命令行选项如下&#xff1a; 2.4.日志分析 3.mtrace 3.1.使用 3.2.注意 3.3.结果分析 4.bcc工具里面的memleak-bpfcc 4.1.命令安装 4.2.源码安装 4.3.结果分析 4.4.辅助命令 5.Sani…...

    2023/3/28 16:40:11
  27. Pytorch构建自己的数据集

    1.Pytorch内置的Dataset Pytorch中内置了许多数据集&#xff0c;我们可以从torchvision库中进行导入。比如&#xff0c;我们可以导入Fashion-MNIST数据集 import torch from torch.utils.data import Dataset from torchvision import datasets from torchvision.transforms …...

    2023/3/28 16:39:01
  28. 【3月比赛合集】20场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!

    CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用…...

    2023/3/28 16:37:34
  29. 经典文献阅读之--LOCUS 2.0(LiDAR为中心的多传感器LSLAM)

    0. 简介 在20年DARPA地下挑战赛中CoSTAR队伍提出了LOCUS这个深度学习模块&#xff0c;在两年后LOCUS2.0出世&#xff0c;LOCUS 2.0包括一种新的基于法线的广义迭代最近点&#xff08;GICP&#xff09;公式&#xff0c;该公式减少了点云对齐的计算时间&#xff0c;一种自适应体…...

    2023/3/28 16:35:26
  30. NDK FFmpeg音视频播放器四

    NDK前期基础知识终于学完了&#xff0c;现在开始进入项目实战学习&#xff0c;通过FFmpeg实现一个简单的音视频播放器。 音视频一二三节已经实现了音视频播放&#xff0c;本节主要是通过Profiler来检测工程存在的内存泄漏问题。 主要内容如下&#xff1a; 1.项目native层内存泄…...

    2023/3/28 16:32:21

最新文章

  1. Git统计项目成员代码提交量

    目录 一、前言 二、Git Bash 三、统计信息 1.统计某项目中成员数量 2.统计所有用户的提交总次数 3.统计所有用户指定时间段的提交次数 4.按用户名统计提交次数 完整脚本如下 一、前言 项目中有很多成员&#xff0c;如何查看各个时间段每个组员的代码提交量&#xff0c;下…...

    2023/3/28 17:11:01
  2. Vue实现单页缓存,下一页刷新

    vue单页缓存实现方案分析 实现前进刷新&#xff0c;返回不刷新的功能&#xff0c;并且返回时可以记住上一页的滚动位置&#xff0c;有两套方案可选 方案一&#xff1a;vue的keep-alive组件 具体使用如下&#xff1a; <keep-alive max"10"><router-view…...

    2023/3/28 17:09:36
  3. Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…...

    2023/3/28 17:03:43
  4. vscode搭建Django环境五:vscode配置react开发环境

    1、安装node 请在官网下载安装&#xff1a;https://nodejs.org/zh-cn/vscode 中新建终端输入指令node -v&#xff0c;能显示版本号&#xff0c;说明 node 已经装好了输入指令npm -v&#xff0c;能显示版本号&#xff0c;说明 npm 可以使用了 nodejs安装参考&#xff1a;https…...

    2023/3/28 17:03:28
  5. TiDB入门篇-数据物理备份和恢复

    简介 快照备份是集群全量备份的一种实现。它基于 TiDB 的多版本并发控制 (MVCC) 实现&#xff0c;将指定快照包含的所有数据备份到目标存储中。备份下来的数据大小约等于集群&#xff08;压缩后的&#xff09;单副本数据大小。备份完成之后&#xff0c;你可以在一个空集群或不…...

    2023/3/28 17:02:48
  6. 电脑录屏怎么录?超详细的录屏教程来了

    案例&#xff1a;电脑录屏怎么录&#xff1f;求详细的电脑录屏教程&#xff01; “最近的工作需要用到电脑录屏&#xff0c;但是我不知道电脑录屏怎么录&#xff1f;去网上搜索了一下教程都是比较大概的&#xff0c;我这个新手小白根本看不懂。在这里想问问大家&#xff0c;有…...

    2023/3/28 17:02:09
  7. 从0使用TCP手撸http服务器一

    背景介绍&#xff1a; 成熟的http服务器框架非常多&#xff0c;例如SB,flask,.net.....这些框架基本上都是运行在操作系统之上&#xff0c;非常的高级。但是我们做嵌入式的望尘莫及&#xff01;当然如果是linux的设备&#xff0c;可能还能用上轻量级的http服务器框架&#xff0…...

    2023/3/28 17:01:16
  8. Linux- 浅谈ELF目标文件格式

    理解了进程的描述和创建之后&#xff0c;自然会想到我们编写的可执行程序是如何作为一个进程工作的&#xff1f;这就涉及可执行文件的格式、编译、链接和装载等相关知识。 这里先提一个常见的名词“目标文件”&#xff0c;是指编译器生成的文件。“目标”指目标平台&#xff0c…...

    2023/3/28 16:59:58
  9. 2022(二等奖)C859基于WebGIS的南京市排污口管理系统

    作品介绍 一、需求分析 &#xff08;一&#xff09;社会需求 《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》明确提出&#xff0c;入河入海排污口(以下简称排污口&#xff09;是指直接或通过管道、沟、渠等排污通道向环境水体排放污水的口门&#xff0c;是流…...

    2023/3/28 16:58:54
  10. MobTech|场景唤醒的实现

    什么是场景唤醒&#xff1f; 场景唤醒是moblink的一项核心功能&#xff0c;可以实现从打开的Web页面&#xff0c;一键唤醒App&#xff0c;并恢复对应的场景。 场景是指用户在App内的某个特定页面或状态&#xff0c;比如商品详情页、活动页、个人主页等。每个场景都有一个唯一…...

    2023/3/28 16:57:55
  11. echarts 关系调用高亮示例 dispatchAction及其遇到的问题

    如图所示 <template><div class"Chart"><div class"main_box"><div class"diagram_box" v-if"activeChart diagram"><div class"drawer"><drawer:drawer.sync"drawer":cusStyl…...

    2023/3/28 16:56:33
  12. L1-018 大笨钟 L1-020 帅到没朋友 L1-034 点赞

    微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&#xff0c;所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的&#xff0c;如果正好在某个整点敲&#xff0c;那么“当”数就等于那个整点数&#xff…...

    2023/3/28 16:55:06
  13. 两个数组的交集(力扣刷题)

    给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-arrays 说…...

    2023/3/28 16:54:40
  14. 【HashMap】jdk1.8中HashMap的插入扩容源码学习分析

    jdk1.8中HashMap的插入扩容源码学习分析 一、成员变量 首先介绍HashMap中各个成员变量的作用&#xff0c;在HashMap中有以下成员变量 size记录了HashMap中键值对的个数 loadFactor&#xff08;加载因子&#xff09;用来决定size达到容量的百分之多少时触发扩容机制 默认是0…...

    2023/3/28 16:53:02
  15. uni-app css尺寸单位rpx介绍

    一&#xff0c;前言 1.在使用uni-app开发小程序时支持的尺寸单位如下 &#xff08;1&#xff09;基础单位&#xff1a;px &#xff0c; rpx &#xff08;2&#xff09;h5单位&#xff1a;rem &#xff0c;vm &#xff0c;vh 2.rpx是微信小程序提出的一种响应式px 二&#x…...

    2023/3/28 16:52:49
  16. 纳瓦尔的推荐读物

    非虚构类 《无穷的开始&#xff1a;世界进步的本源》&#xff0c;戴维多伊奇这本书不是很好理解&#xff0c;但确实让我变得更聪明了。 《人类简史&#xff1a;从动物到上帝》&#xff0c;尤瓦尔赫拉利这本书介绍了人类的历史。书中的观察、框架和心智模型会让你以不同的方式看…...

    2023/3/28 16:50:33
  17. 【JavaScript】43_DOM编程:DOM修改与demo

    10、DOM的修改 appendChild() 用于给一个节点添加子节点 list.appendChild(li) insertAdjacentElement() 可以向元素的任意位置添加元素 两个参数&#xff1a; 1.要添加的位置 2.要添加的元素 beforeend 标签的最后 afterbegin 标签的开始 beforebegin 在元素的前边插…...

    2023/3/28 16:50:09
  18. Ubuntu下解决 ×.so.×: wrong ELF class: ELFCLASS64 的问题

    安装软件时出现问题 .so.:wrong ELF class: ELFCLASS64 &#xff0c;大致的意思是软件是32位的&#xff0c;需要32位的 .so.动态链接库&#xff0c;而系统是64位的所提供的该 动态链接库.so.是64位的&#xff0c;所以不能用。 首先可以查看自己的64位系统是否开启了32位支持功…...

    2023/3/28 16:48:11
  19. [学习笔记]PowerBI数据分析与可视化-B站数据大白

    参考资料 B站视频-Power BI 数据分析与可视化 前言 原视频中可能的勘误在笔记中有修改。CtrlF搜索“勘误”两个字可以快速定位到勘误。 原视频中可能的差异在笔记中有提及。CtrlF搜索“差异”两个字可以快速定位到勘误。 2. 建模与DAX函数 2.01 建立关系模型 表可以分为维…...

    2023/3/28 16:47:41
  20. 如何进行安全可靠的API身份验证?

    前言&#xff1a; 在开发安全的 REST API 时&#xff0c;身份验证是必不可少的。你可以将你的应用程序想象成一个聚会&#xff0c;那么身份验证就像一扇门&#xff0c;决定哪些客人可以进入——或者更准确地说&#xff0c;哪些请求可以进出。 接下来我将介绍四种常用的身份验证…...

    2023/3/28 16:46:37
  21. Python机器学习1

    机器学习现在很火的&#xff0c;纯纯的行业红海&#xff0c;虽然我已经脱离计算机行业了&#xff0c;但是我觉得&#xff0c;机器学习还是有必要学一下的&#xff0c;说不定以后会用的上呢&#xff0c;所以&#xff0c;乘着现在研一时间还比较多&#xff0c;除了自己研究方向以…...

    2023/3/28 16:46:05
  22. 局部变量被莫名的改变如何处理

    问题背景&#xff1a; 一个函数内部的局部变量 初始化 X0&#xff0c;然后中间X 。再去访问时&#xff0c;X还是0&#xff1b; 伪代码 function A {int x0;int buff[4096];int tx[4096];....;;;; for() {x....if(x 1){.........}function B(buff)function C()......} } 原本…...

    2023/3/28 16:45:51
  23. 基于springboot实现财务管理系统【源码+论文】分享

    基于springboot实现财务管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xf…...

    2023/3/28 16:44:52
  24. KEYSIGHT DAQ970A/是德科技DAQ970A数据采集器

    产品概览 KEYSIGHT / AGILENT DAQ970A 数据采集系统 Keysight DAQ970A 是下一代数据采集 (DAQ) 系统&#xff0c;具有 3 插槽主机和 8 个插件模块供您选择。DAQ970A 具有 6 位&#xff08;22 位&#xff09;分辨率、0.004% 基本 dcV 精度和超低读取噪声。内部自动量程 DMM 直…...

    2023/3/28 16:44:04
  25. CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理

    作者&#xff1a;林苍 背景 容器无疑已经成为新的云计算基础设施&#xff0c;企业私有云平台的建设重心&#xff0c;正在从虚拟化的计算、存储、网络的建设&#xff0c;转向构建以容器、微服务等为核心的云原生平台。不过值得注意的是&#xff0c;企业 IT 系统在进行容器化改造…...

    2023/3/28 16:43:23
  26. linux 内存泄漏排查--多种工具介绍

    目录 1.工具 2.valgrind 2.1.Valgrind 安装 2.2.valgrind 使用 2.3.valgrind常见的命令行选项如下&#xff1a; 2.4.日志分析 3.mtrace 3.1.使用 3.2.注意 3.3.结果分析 4.bcc工具里面的memleak-bpfcc 4.1.命令安装 4.2.源码安装 4.3.结果分析 4.4.辅助命令 5.Sani…...

    2023/3/28 16:40:11
  27. Pytorch构建自己的数据集

    1.Pytorch内置的Dataset Pytorch中内置了许多数据集&#xff0c;我们可以从torchvision库中进行导入。比如&#xff0c;我们可以导入Fashion-MNIST数据集 import torch from torch.utils.data import Dataset from torchvision import datasets from torchvision.transforms …...

    2023/3/28 16:39:01
  28. 【3月比赛合集】20场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!

    CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用…...

    2023/3/28 16:37:34
  29. 经典文献阅读之--LOCUS 2.0(LiDAR为中心的多传感器LSLAM)

    0. 简介 在20年DARPA地下挑战赛中CoSTAR队伍提出了LOCUS这个深度学习模块&#xff0c;在两年后LOCUS2.0出世&#xff0c;LOCUS 2.0包括一种新的基于法线的广义迭代最近点&#xff08;GICP&#xff09;公式&#xff0c;该公式减少了点云对齐的计算时间&#xff0c;一种自适应体…...

    2023/3/28 16:35:26
  30. NDK FFmpeg音视频播放器四

    NDK前期基础知识终于学完了&#xff0c;现在开始进入项目实战学习&#xff0c;通过FFmpeg实现一个简单的音视频播放器。 音视频一二三节已经实现了音视频播放&#xff0c;本节主要是通过Profiler来检测工程存在的内存泄漏问题。 主要内容如下&#xff1a; 1.项目native层内存泄…...

    2023/3/28 16:32:21