hot100(4)
31.437. 路径总和 III - 力扣(LeetCode)
方法一:递归、dfs
由树的结构想到使用递归解决,且路径相关问题容易考虑到使用dfs和bfs.
使用dfs解决,这里关键在于如何设计递归函数。
递归函数的参数:root,targetSum
递归函数的返回值:以root为根节点,路径和为targetSum的数量
递归函数的单层逻辑:
(1)判断返回条件,root == null,return 0
(2)计算当层结点路径数,需要递归调用得到左节点pathSum(root.left,targetSum - val) 右节点 pathSum(root.right,targetSum - val) 的结果,返回二者之和
rootSum:以当前节点为根节点,路径和等于targetSum的路径数
pathSum:root数中所有路径和等于targetSum的路径数
这种暴力dfs解法的关键之处在于理解需要嵌套两层暴力遍历
public int pathSum(TreeNode root, long targetSum) {if(root == null) return 0;int ret = rootSum(root,targetSum);ret += pathSum(root.left,targetSum);ret += pathSum(root.right, targetSum);return ret;}public int rootSum(TreeNode root, long targetSum){if(root == null) return 0;int ret = 0 ;if(root.val == targetSum){ret += 1;}ret += rootSum(root.left,targetSum - root.val);ret += rootSum(root.right, targetSum - root.val);return ret;}
复杂度分析:对于每一个节点,求以该节点为起点的路径数目时,都要遍历以该节点为根节点的子树的所有节点,最大时间为O(N);对每一个节点都要进行这样的操作,节点数为N,因此时间复杂度为O(N^2),空间复杂度O(N)
方法二:前缀和 优化方法一
方法一中对每个节点都进行了以该节点为根节点的dfs,这些dfs的很多计算是重复的,可以使用更加合理的计算顺序避免这些重复。
定义前缀和:根节点到当前节点的路径上,除了当前节点以外的所有节点的和
Map<Long,Integer> prefix;public int pathSum(TreeNode root, long targetSum) {prefix = new HashMap<>();prefix.put(0L,1);return dfs(root,targetSum,0);}public int dfs(TreeNode root, long targetSum, long curr){if(root == null) return 0;int res = 0;curr += root.val;res += prefix.getOrDefault(curr - targetSum, 0);prefix.put( curr,prefix.getOrDefault(curr,0) + 1);res += dfs(root.left, targetSum,curr);res += dfs(root.right, targetSum,curr);prefix.put(curr,prefix.getOrDefault(curr,0) - 1);return res;}
32.416. 分割等和子集 - 力扣(LeetCode)
回溯会超时,考虑动态规划。
从背包问题的角度看本题的本质:能否把sum/2的背包装满。
重量和价值都是数字大小,判断能否把sum/2的背包装满即判断背包价值最大是否是sum/2。
用01背包解决这个问题:
(1)dp[j]:容量为j的背包所能装入的最大价值为dp[j]
(2)dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]
(3)dp[0] = 0;
(4)先物品,后背包,背包容量逆序
(5)模拟
public boolean canPartition(int[] nums) {int sum = 0;for (int num : nums) {sum += num;}if(sum % 2 == 1) return false;int target = sum/2;int[] dp = new int[target + 1];for(int i = 0 ; i < nums.length ; i++){for(int j = target ; j >= nums[i] ; j--){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);}}return dp[target] == target;}
33.406. 根据身高重建队列 - 力扣(LeetCode)
题目描述:整数对 (h, k)
表示,其中 h
是这个人的身高,k
是排在这个人前面且身高大于或等于 h
的人数。
一般这种数对,且涉及排序的,根据第一个元素降序排序,根据第二个元素升序排序;或根据第一个元素升序排序,根据第二个元素降序排序,往往能够简化解题过程。
具体到这一道题,我们对身高降序排序,让身高大的排在前面;如果身高相同,则对k升序排序,让k小的排在前面。这样是为了先处理身高大的人,在这道题中,先处理身高大的是为了确保在插入过程中,已经排好位置的人能够满足条件。
关键点:
- 每个人的条件是:
k
个比他高的人已经排在他前面。 - 即处理好身高大的人的k值,这之后对身高小的人的插入是不影响身高大的人的k值的。(可以看成是每个人只能看到比自己高的人,身高大的人看不到身高小的人)
举例排序:
public int[][] reconstructQueue(int[][] people) {Arrays.sort(people,(a,b)->{if(a[0] == b[0]){return a[1] - b[1];}else{return b[0] - a[0];}});List<int[]> list = new ArrayList<>();for (int[] person : people) {list.add(person[1],person);}return list.toArray(new int[people.length][]);}
34.399. 除法求值 - 力扣(LeetCode)
根据本题的描述,容易考虑到使用图论的方法解决。即是把value考虑成边的权重,var考虑成图的结点。
根据equations和values建好图,从queries中得到from 和 dest,然后在图中进行bfs,bfs的时候要记录from到么每一个节点的ratios(可以考虑成本题中特殊的距离,为路径权重乘积)。
这里bfs的时候没有用到visited数组,因为题目中明确权重>0,因此只要判断ratios[i]是否小于0即可得到是否来过。
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {int nvar = 0;Map<String,Integer> index = new HashMap<>();for (List<String> equation : equations) {if(!index.containsKey(equation.get(0))){index.put(equation.get(0),nvar++);}if(!index.containsKey(equation.get(1))){index.put(equation.get(1),nvar++);}}List<List<Pair>> graph = new ArrayList<>();for(int i = 0 ; i < nvar ; i++){graph.add(new ArrayList<>());}for(int i = 0 ; i < equations.size() ; i++){String sva = equations.get(i).get(0);int va = index.get(sva);String svb = equations.get(i).get(1);int vb = index.get(svb);graph.get(va).add(new Pair(vb,values[i]));graph.get(vb).add(new Pair(va,1.0/values[i]));}double[] res = new double[queries.size()];for(int i = 0 ; i < queries.size() ; i++){Queue<Integer> queue = new ArrayDeque<>();String sfrom = queries.get(i).get(0);String sdest = queries.get(i).get(1);double result = -1.0;if(index.containsKey(sfrom) && index.containsKey(sdest)){if(sfrom.equals(sdest)){result = 1.0;}else{int from = index.get(sfrom);int dest = index.get(sdest);queue.offer(from);double[] ratios = new double[nvar];Arrays.fill(ratios,-1.0);ratios[from] = 1.0;while(!queue.isEmpty() && ratios[dest] < 0){int node = queue.poll();List<Pair> neighbors = graph.get(node);for (Pair neighbor : neighbors) {if(ratios[neighbor.index] < 0){ratios[neighbor.index] = ratios[node] * neighbor.value;queue.offer(neighbor.index);}}}result = ratios[dest];}}res[i] = result;}return res;}class Pair{int index;double value;Pair(){}Pair(int neighbor, double value){this.index = neighbor;this.value = value;}}
方法II 并查集
这里回顾一下并查集和使用场景和使用方法
通常来说,并查集用来解决连通性问题,即判断两个元素是否在同一个集合里的时候,要想到用并查集,通常用于图论里的连通性判断。
并查集里的集合用一维数组来表示,如A,B,C在一个集合里,即father[A] = B,
father[B] = C father[C] = C.
并查集里的路径压缩:在递归find的过程中,让father[u]接住 find(father[u])的返回结果。
即:
// 并查集里寻根的过程
int find(int u) {if (u == father[u]) return u;else return father[u] = find(father[u]); // 路径压缩
}
完整的并查集Java模板如下:
public class UnionFind {private int[] parent;public UnionFind(int size) {parent = new int[size];init();}// 并查集初始化private void init() {for (int i = 0; i < parent.length; i++) {parent[i] = i;}}// 并查集里寻根的过程public int find(int u) {if (u != parent[u]) {parent[u] = find(parent[u]); // 路径压缩}return parent[u];}// 判断 u 和 v 是否找到同一个根public boolean isSame(int u, int v) {return find(u) == find(v);}// 将 v -> u 这条边加入并查集public void join(int u, int v) {int rootU = find(u); // 寻找 u 的根int rootV = find(v); // 寻找 v 的根if (rootU != rootV) { // 如果根不同,合并两个集合parent[rootV] = rootU;}}public static void main(String[] args) {int n = 1005; // 根据实际情况调整UnionFind uf = new UnionFind(n);// 示例: 加入一些连接uf.join(1, 2);uf.join(2, 3);// 检查是否在同一个集合System.out.println(uf.isSame(1, 3)); // 输出 trueSystem.out.println(uf.isSame(1, 4)); // 输出 false}
}
在本题中,要求的是变量之间的关系,并且变量之间的倍数关系具有传递性,处理具有传递性的问题,可以使用并查集。我们需要再并查集的 合并 与 查询 操作中维护这些变量之间的倍数关系。
class Solution {public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {Map<String,Integer> map = new HashMap<>(equations.size()*2);UnionFind uf = new UnionFind(equations.size()*2);int nvar = 0;for (List<String> equation : equations) {String svar1 = equation.get(0);String svar2 = equation.get(1);if(!map.containsKey(svar1)){map.put(svar1,nvar++);}if(!map.containsKey(svar2)){map.put(svar2,nvar++);}}for(int i = 0 ; i < equations.size() ; i++){int var1 = map.get(equations.get(i).get(0));int var2 = map.get(equations.get(i).get(1));double value = values[i];uf.union(var1,var2,value);}double[] res = new double[queries.size()];for(int i = 0 ; i < queries.size() ; i++){int var1 = map.getOrDefault(queries.get(i).get(0),-1);int var2 = map.getOrDefault(queries.get(i).get(1),-1);if(var1 == -1 || var2 == -1){res[i] = -1.0d;continue;}res[i] = uf.isConnected(var1,var2);}return res;}class UnionFind{int[] parent;double[] weight;UnionFind(int size) {parent = new int[size];weight = new double[size];Arrays.fill(weight,1.0);for(int i = 0 ; i < size ; i++){parent[i] = i;}}public void union(int x , int y , double value){int rootX = find(x);int rootY = find(y);if(rootX != rootY){parent[rootX] = rootY;weight[rootX] = weight[y] * value/weight[x];}}public int find(int x){if(x != parent[x]){int index = parent[x];parent[x] = find(parent[x]);weight[x] *= weight[index];}return parent[x];}public double isConnected(int x , int y){int rootX = find(x);int rootY = find(y);if(rootX != rootY){return -1.0d;}else{return weight[x]/weight[y];}}}
}
35.394. 字符串解码 - 力扣(LeetCode)
字符串问题,括号问题,使用栈或递归解决
class Solution {public String decodeString(String s) {Deque<Integer> stack_multi = new ArrayDeque<>();Deque<String> stack_string = new ArrayDeque<>();int multi = 0;StringBuilder res = new StringBuilder();for(int i = 0 ; i < s.length() ; i++){if(s.charAt(i) == '['){stack_multi.push(multi);multi = 0;stack_string.push(res.toString());res = new StringBuilder();}else if(s.charAt(i) == ']'){StringBuilder tmp = new StringBuilder();int curr_multi = stack_multi.pop();for(int j = 0 ; j < curr_multi ; j++){tmp.append(res);}res = new StringBuilder(stack_string.pop() + tmp);}else if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){multi = multi * 10 + Integer.parseInt(String.valueOf(s.charAt(i)));}else{res.append(s.charAt(i));}}return res.toString();}
}
36.347. 前 K 个高频元素 - 力扣(LeetCode)
I 暴力比较
要使用Arrays.sort比较自定义的数据结构的话,需要实现Comparator<>接口
public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();for (int num : nums) {map.put(num,map.getOrDefault(num,0)+1);}Pair[] pairs = new Pair[map.entrySet().size()];int i = 0;for (Map.Entry<Integer, Integer> entry : map.entrySet()) {pairs[i++] = new Pair(entry.getValue(),entry.getKey());}Arrays.sort(pairs);int[] res = new int[k];for(int j = 0 ; j < k ; j++){res[j] = pairs[j].value;}return res;}class Pair implements Comparable<Pair>{int num;int value;Pair(){}Pair(int num, int value) {this.num = num;this.value = value;}@Overridepublic int compareTo(Pair o) {return Integer.compare(o.num,this.num);}}
II 小根堆 PriorityQueue
public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();for (int num : nums) {map.put(num,map.getOrDefault(num,0) + 1);}PriorityQueue<int[]> heap = new PriorityQueue<>((pair1,pair2)->pair1[1] - pair2[1]);for (Map.Entry<Integer, Integer> entry : map.entrySet()) {if(heap.size() < k){heap.add(new int[]{ entry.getKey(),entry.getValue()});}else{if(heap.peek()[1] < entry.getValue()){heap.poll();heap.add(new int[]{entry.getKey(),entry.getValue()});}}}int[] res = new int[k];for(int i = 0 ; i < k ; i++){res[i] = heap.poll()[0];}return res;}
37.338. 比特位计数 - 力扣(LeetCode)
public int[] countBits(int n) {int[] res = new int[n+1];for(int i = 0 ; i <= n ; i++){res[i] = Integer.bitCount(i);}return res;}
38.337. 打家劫舍 III - 力扣(LeetCode)
本题一定是要后序遍历,因为通过递归函数的返回值来做下一步计算。
与198.打家劫舍,213.打家劫舍II一样,关键是要讨论当前节点抢还是不抢。
如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子(注意这里说的是“考虑”)
方法I 后序遍历,会时间超限
public int rob(TreeNode root) {if(root == null) return 0;if(root.left == null && root.right == null){return root.val;}//不考虑抢劫rootint val1 = rob(root.left) + rob(root.right);//考虑抢劫rootint val2 = root.val;if(root.left != null) val2 = val2 + rob(root.left.left) + rob(root.left.right);if(root.right != null) val2 = val2 + rob(root.right.left) + rob(root.right.right);return Math.max(val1,val2);}
II 记忆化递推
把当前节点的计算结果存储到map中,如果计算过了,则直接返回,避免重复计算
Map<TreeNode,Integer> map = new HashMap<>();public int rob(TreeNode root) {if(root == null) return 0;if(root.left == null && root.right == null){return root.val;}if(map.containsKey(root)) return map.get(root);//不考虑抢劫rootint val1 = rob(root.left) + rob(root.right);//考虑抢劫rootint val2 = root.val;if(root.left != null) val2 = val2 + rob(root.left.left) + rob(root.left.right);if(root.right != null) val2 = val2 + rob(root.right.left) + rob(root.right.right);map.put(root,Math.max(val1,val2));return Math.max(val1,val2);}
III 动态规划
在上面两种方法,其实对一个节点 偷与不偷得到的最大金钱都没有做记录,而是需要实时计算。
而动态规划其实就是使用状态转移容器来记录状态的变化,这里可以使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。
之前用的状态转移容器是数组,这里选择的状态转移容器也是int[]数组,只是结合了树这种数据结构,并根据树形结构的特征结合了递归。
这道题目算是树形dp的入门题目,因为是在树上进行状态转移,下面以递归三部曲为框架,其中融合动规五部曲的内容来进行讲解。
1.确定递归函数的参数和返回值
要维护一个结点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。
dp数组及下标含义:dp[0] : 不偷该节点所得到的最大金钱,dp[1]:偷该节点所得到的最大金钱。
2.确定递归终止条件
if(root == null) return new int[]{0,0};
也相当于dp数组初始化
3.确定遍历顺序
使用后序遍历,因为需要递归函数的返回值做下一步计算。
4.确定单层递归的逻辑
如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (如果对下标含义不理解就再回顾一下dp数组的含义)
如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);
最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}
5.举例推导dp数组
- 时间复杂度O(n),每个节点只遍历了一次
- 空间复杂度O(logn),递推系统栈的空间
public int rob(TreeNode root) {int[] res = robTree(root);return Math.max(res[0],res[1]);}public int[] robTree(TreeNode root){if(root == null) return new int[]{0,0};int[] left = robTree(root.left);int[] right = robTree(root.right);//不偷根节点int val1 = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);//偷根节点int val2 = root.val + left[0] + right[0];return new int[]{val1,val2};}
39.121. 买卖股票的最佳时机 - 力扣(LeetCode)
本题限制性要求在于只能买卖股票一次
I贪心
由于只能买卖一次,因此贪心算法选择遍历一次,在遍历的过程中记录每个数字左侧的最小值,与当前能赚到的差价作比较,遍历一次得到最大的差价,即最大的利润。
public int maxProfit(int[] prices) {int low = Integer.MAX_VALUE;int res = 0;for(int i = 0 ; i < prices.length ; i++){low = Math.min(low,prices[i]);res = Math.max(res,prices[i] - low);}return res;}
II动态规划
本题中的状态有持有股票和不持有股票两种
1.dp数组及下标的含义
dp[i][0] : 第i天持有股票所得最多现金
dp[i][1] : 第i天不持有股票所得最多现金
2.递推公式
dp[i][0] = Math.max(dp[i-1][0] , dp[i-1][1] - prices[i]);
dp[i][1] = Math.max(dp[i-1][0] + prices[i] , dp[i-1][1]);
3.初始化
dp[0][0] = - prices[0];
dp[0][1] = 0;
4.遍历顺序
从前向后
5.举例推导dp数组
时间复杂度O(n)
空间复杂度O(n),使用滚动数组可以优化到O(1)
public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i = 1 ; i < prices.length ; i++){dp[i][0] = Math.max(dp[i-1][0], - prices[i]);dp[i][1] = Math.max(dp[i-1][0] + prices[i] ,dp[i-1][1]);}return dp[prices.length - 1][1];}
40.312. 戳气球 - 力扣(LeetCode)
区间dp问题,详细生动题解:312. 戳气球 题解- 力扣(LeetCode)
1.dp数组及下标含义
dp[i][j]:开区间(i,j),所能得到的最大硬币数
2.状态转移方程
for k (k > i && k < j )
dp[i][j] = max{dp[i][k] + dp[k][j] + val[i] * val[k] * val[j]}
3.初始化
为了方便处理,nums前后加上边界1,题目中称边界视为1,这样可以避开对边界的讨论
4.遍历顺序
遍历长度length 从 2 到哦 list.size()
5.dp模拟
public int maxCoins(int[] nums) {List<Integer> list = new ArrayList<>();for (int num : nums) {list.add(num);}list.add(0,1);list.add(list.size(),1);int[][] dp = new int[list.size()][list.size()];for(int length = 1 ; length <= nums.length; length++){for(int i = 0 ; i < list.size() - length - 1; i++){int j = i + length + 1;int maxCoins = 0;for(int k = i + 1 ; k < j ; k++){if(dp[i][k] + dp[k][j] + list.get(i)*list.get(k)*list.get(j) > maxCoins){maxCoins = dp[i][k] + dp[k][j] + list.get(i)*list.get(k)*list.get(j);}}dp[i][j] = maxCoins;}}return dp[0][list.size()-1];}
相关文章:
hot100(4)
31.437. 路径总和 III - 力扣(LeetCode) 方法一:递归、dfs 由树的结构想到使用递归解决,且路径相关问题容易考虑到使用dfs和bfs. 使用dfs解决,这里关键在于如何设计递归函数。 递归函数的参数:root,tar…...
海浪波高预测(背景调研)
#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…...
C++ 3
delete 和 free 有什么区别? delete和free都是用来释放动态分配的内存,但它们有不同的使用方式: 语法: ○ delete是C中的关键字,用于释放由new分配的对象。 ○ free是C语言中的函数,通常包含在<stdlib…...
【逻辑学导论】1.4论证与说明
许多语段看起来好像是论证,实际上不是论证而是说明。即使有某些前提或结论指示词出现,例如“因为”“由于”“因”“所以”等,也不能解决问题,这些语词既可用在论证中也可用在说明中(虽然“因……”一词有时可以指时间…...
vue3+elementPlus之后台管理系统(从0到1)(day4-完结)
面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据,渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…...
Python标准库 - os (2) 进程管理
文章目录 3 进程管理3.1 进程状态和控制3.2 进程优先级3.3 程序段控制3.4 其他 4 创建子进程4.1 创建子进程常见函数4.2 spawn*族函数4.3 exec*族函数 5 子进程管理5.1 创建子进程触发事件5.2 等待子进程执行完5.3 子进程的状态 os模块提供了各种操作系统接口。包括环境变量、进…...
单细胞-第四节 多样本数据分析,下游画图
文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...
【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)
一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...
AI软件栈:LLVM分析(一)
文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …...
【Elasticsearch】 Intervals Query
Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则,这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…...
Ansys Maxwell:采用对称性的双转子轴向磁通电机
轴向磁通电机因其功率密度高于相同重量的传统径向磁通电机而变得非常受欢迎,并且在电动汽车和航空应用中非常高效且具有成本效益。功率密度是输出功率与机器体积的比率。对于给定尺寸的机器,轴向磁通电机提供更大的扭矩和功率,或者对于给定的…...
你的连接不是专用连接
当你打开网站看到如下提示,说明SSL证书到期了。 攻击者可能试图www窃取你的信息(例如、密码、消息或信用卡)。详细了解此警告 NET::ERR_CERT_DATE_INVALID 此服务器无法证明它是WWW ;它的安全证书已于2天前到期。这可能是错误配置或攻击者…...
CSS核心
CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签,在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方,但一般会放在文档的 <head> 标签中。 <style> div { color: r…...
AI常见的算法和例子
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 例子代码:纠结哥/pytorch_learn 1. 机器学习 (Machine Learning) 监督学习 (S…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
【QT】 控件 -- 显示类
🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...
AI语言模型竞争加剧:新秀崛起 格局生变
标题:AI语言模型竞争加剧:新秀崛起 格局生变 文章信息摘要: AI语言模型领域呈现加速发展和分化态势。在LMSYS排行榜上,Claude 3 Opus超越GPT-4 Turbo,DBRX超越Mixtral成为最佳开源模型,显示领先位置更替频…...
RK3568使用opencv(使用摄像头捕获图像数据显示)
文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结 二、代码实现 一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者…...
leetcode——排序链表(java)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …...
Windows安装Miniconda和PySide6以及配置PyCharm
目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...
floodfill算法(6题)
本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...
Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...
python:洛伦兹变换
洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…...
题单:插入排序
题目描述 给定 n 个元素的数组(下标从1开始计),请使用插入排序对其进行排序(升序)。 输入格式 两行,第一行为一个整数 n,表示元素的个数。 第二行 n 个空格分隔的整数,表示数组的…...
【Spring】Spring启示录
目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
Node.js 的底层原理
Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...
Nuxt:利用public-ip这个npm包来获取公网IP
目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子: <template…...
572. 另一棵树的子树
前导题:100. 相同的树 回顾一下 判断两棵二叉树相同,根结点相同 且 左子树相同 且 右子树相同。 于是判断如下: 根结点都为null,返回true根结点不都为null,返回false根结点都不为null,但是值不相同&#…...
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...
菜鸟之路Day11-12一一集合进阶(四)
菜鸟之路Day11-12一一集合进阶(四) 作者:blue 时间:2025.1.29-1.30 文章目录 菜鸟之路Day11-12一一集合进阶(四)0.概述1.可变参数2.Collections3.综合练习4.不可变的集合5.Stream流 0.概述 内容学习自黑…...
在Ubuntu下编译VLC
参考链接: https://blog.csdn.net/zyhse/article/details/113662686...
python开发,最好的环境是什么
目录 1. 集成开发环境(IDE) 1.1 PyCharm 1.2 Visual Studio Code (VSCode) 2. 文本编辑器 2.1 Sublime Text 2.2 Vim/NeoVim 3. 虚拟环境管理 4. 版本控制与协作 5. 容器化开发 6. 项目管理与依赖管理工具 7. 单元测试与调试 最佳组合推荐 …...
Maui学习笔记- SQLite简单使用案例02添加详情页
我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...
创建前端项目的方法
目录 一、创建前端项目的方法 1.前提:安装Vue CLI 2.方式一:vue create项目名称 3.方式二:vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提:安装Vue CLI npm i vue/cli -g 2.方式一&…...
好用的AI/解析网站
文件解析 json文件解析:http://www.yunjson.com/jsoncheck/...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...
SpringBoot AOP 和 事务
SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…...
如何使用Python调用大语言模型的API接口?
以下是使用 Python 调用几种常见大语言模型 API 接口的详细步骤和示例代码: 1. 调用 OpenAI 的 GPT 模型 API OpenAI 提供了强大的 GPT 系列模型,使用其 API 需要先注册 OpenAI 账号并获取 API 密钥。 步骤: 安装openai库:pip…...
如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
在Ubuntu系统中,可以通过编写脚本结合cron或systemd来监控程序的运行状态,并在程序异常时自动重启。以下是具体步骤: 方法一:使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行,并在程序异常时重…...
Kafka 压缩算法详细介绍
文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
在K8s中部署动态nfs存储provisioner
背景 之前,我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统(metrics和logs的时序数据库需要永久存储)࿰…...
SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定
目录 绕过手法 前端代码绕过 后端代码绕过 各种字段进行验证 union 大小写绕过 双写逃过 强制类型判断 引号特殊编码处理。 内联注释绕过 注释符绕过 or/and绕过 空格绕过 防御SQL注入的方法 使用预编译语句 使用存储过程 检查数据类型 绕过手法 前端代码绕过…...
C++ 写一个简单的加减法计算器
************* C topic:结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...