LeetCode_動態規劃1

動態規劃

  • 1.動態規劃總結
    • 1.1 01背
      • 1.1.1 二維數組
      • 1.1.2 一維數組
    • 1.2 完全背包
  • 2.斐波那契數(力扣509)
  • 3.爬樓梯(力扣70)
  • 4.使用最小花費爬樓梯(力扣746)
  • 5.不同路徑(力扣62)
  • 6.不同路徑 II(力扣63)
  • 7.整數拆分(力扣343)
  • 8.不同的二叉搜索樹(力扣96)
  • 9.分割等和子集(力扣416)
  • 10.最后一塊石頭的重量 II(力扣1049)
  • 11.目標和(力扣494)
  • 12.一和零(力扣474)
  • 13.零錢兌換 II(力扣518)
  • 14.組合總和 Ⅳ(力扣377)
  • 15.爬樓梯(力扣70)
  • 16.零錢兌換(力扣322)
  • 17.完全平方數(力扣279)
  • 18.單詞拆分(力扣139)
  • 19.打家劫舍(力扣198)
  • 20.打家劫舍 II(力扣213)
  • 21.打家劫舍 III(力扣337)

1.動態規劃總結

1.1 01背

題目描述:假設背包容量為4,物品重量分別為1,3,4,價值分別為10,15,20,使裝入包中的物品的價值最大。

1.1.1 二維數組

先物品后背包,每次新增一個物品,判斷要不要加入到背包中

		/* 先遍歷物品 */for(int i = 1;i < m;i ++){/* 再遍歷背包容量 */for(int j = 1;j <= n;j ++){/* 容量>=當前物品重量,可以考慮放或不放當前物品 */if(j >= nums[i]){dp[i][j] = Math.max(dp[i - 1][j],dp[i - 1][j - nums[i]] + nums[i]);/* 否則只能選擇不放當前物品 */    }else{dp[i][j] = dp[i - 1][j];}}}

先背包后物品

		for(int j = 1;j < n;j ++){for(int i = 1;i <= m;i ++){//判斷當前物品到底加不加入背包if(j >= nums[i]){dp[i][j] = Math.max(dp[i - 1][j],dp[i - 1][j - nums[i]] + nums[i]);}else{dp[i][j] = dp[i - 1][j];}}}

在這里插入圖片描述
兩種遍歷方式得到的結果相同,不過一個是逐行填寫,一個是逐列填寫。

1.1.2 一維數組

		for(int i = 1;i < m;i ++){for(int j = n;j >= nums[i];j --){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);}}

一維數組,即滾動數組,先物品后背包,且背包從大到小

如果背包沒有從大到小

		for(int i = 1;i < m;i ++){//背包從小到大for(int j = 1;j <= n;j ++){if(j >= nums[i]){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);}}}

dp[1]=10,dp[2]=20,此時出現添加入重復物品的情況

如果不是先物品后背包

		for(int j = n;j >= 0;j --){for(int i = 1;i < m;i ++){if(j >= nums[i]){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);}}}

每次只放入一個物品

對于二維數組,時刻想著可到達當前狀態的路徑(從左上,正上方,正左方)
在這里插入圖片描述

1.2 完全背包

在求裝滿背包有幾種方案的時候,認清遍歷順序是非常關鍵的。
如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。
如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。

2.斐波那契數(力扣509)

class Solution {public int fib(int n) {if (n < 2){return n;}int f0 = 0, f1 = 1;int res = 0;for (int i = 2; i <= n; i++) {res = f0 + f1;f0 = f1;f1 = res;}return res;}
}
class Solution {/* 遞歸,不過很費時間 */public int fib(int n) {if(n < 2) return n;return fib(n - 1) + fib(n - 2);}
}

3.爬樓梯(力扣70)

//1.動態規劃public int climbStairs(int n) {if(n <= 1) return n;//dp[i]:到達第i階有多少種走法int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 2;for(int i = 3;i <= n;i ++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}//當然此題也可以像斐波那契數列一樣將數組替換為變量

4.使用最小花費爬樓梯(力扣746)

class Solution {public int minCostClimbingStairs(int[] cost) {if(cost == null){return 0;}int len = cost.length;/* dp[i]表示到達第i階的最小花費。特別注意本題有個坑,"樓梯頂部"也算一級,所以動規數組長度為len+1 */int[] dp = new int[len + 1];/* 第一步不花費體力 */dp[0] = 0;dp[1] = 0;for (int i = 2; i <= len; i ++){dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);}return dp[len];}
}

5.不同路徑(力扣62)

//1.動態規劃public int uniquePaths(int m, int n) {//dp[i][j]表示到第i行,第j列的不同路徑總數int[][] dp = new int[m][n];for(int i = 0;i < m;i ++){dp[i][0] = 1;}for(int i = 0;i < n;i ++){dp[0][i] = 1;}for(int i = 1;i < m;i ++){for(int j = 1;j < n;j ++){//因為只能向下或向右移動,可以得到狀態轉移方程//dp[i][j] = dp[i - 1][j] + dp[i][j - 1];dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
/* 可以轉化為組合問題:即從m+n-2個數中取m-1個數,有多少種方法 */public int uniquePaths3(int m, int n) {long ans = 1;for(int i = n,j = 1;j < m;i ++,j ++){ans = ans * i / j;}return (int)ans;}

6.不同路徑 II(力扣63)

class Solution {/* 動態規劃 */public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;/* dp[i][j]:表示到達obstacleGrid[i][j]的可走路徑數量 */int[][] dp = new int[m][n];/* 初始化第一列的值:如果發現1,則后面的行皆初始化為0 */for(int i = 0;i < m;i ++){if(obstacleGrid[i][0] != 1){dp[i][0] = 1;}else{break;}}/* 初始化第一行的值:如果發現1,則后面的列皆初始化為0 */for(int i = 0;i < n;i ++){if(obstacleGrid[0][i] != 1){dp[0][i] = 1;}else{break;}}for(int i = 1;i < m;i ++){for(int j = 1;j < n;j ++){/* 如果數組中對應位置為1,將可達路徑數量置為0 */if(obstacleGrid[i][j] == 1){dp[i][j] = 0;/* 否則,統計從左邊和上邊到達的路徑數量 */    }else{dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m - 1][n - 1];}
}

7.整數拆分(力扣343)

class Solution {//1.動態規劃public int integerBreak(int n) {/* dp[i]為正整數i拆分結果的最大乘積 */int[] dp = new int[n + 1];/* 初始化 */dp[2] = 1;for(int i = 3; i <= n; i ++){for(int j = 1; j < i; j ++){/* j*(i-j)代表把i拆分為j和i-j兩個數相乘 *//* j*dp[i-j]代表把i拆分成j和繼續把(i-j)這個數拆分,* 取(i-j)拆分結果中的最大乘積與j相乘 */dp[i] = Math.max(dp[i], Math.max(j * (i - j),  j * dp[i - j]));}}return dp[n];}
}
//2.找規律/**       n          拆分*       1           0*       2           1+1*       3           1+2*       4           2+2*       5           3+2*       6           3+3*       7           3+4*       8           3+3+2*       9           3+3+3*       10          3+3+4*       11          3+3+3+2*       ...* *///按3拆分,當剩余數等于1時,和前面的3合并為4,剩余數為2時,直接相乘public int integerBreak2(int n) {if(n <= 3) return n - 1;int a = 1;while(n > 4){n -= 3;a *= 3;}return a * n;}

8.不同的二叉搜索樹(力扣96)

class Solution {//1.動態規劃/** 解題思路:* 假設n個節點存在二叉排序樹的個數是G(n),1為根節點,2為根節點,...,n為根節點,* 當1為根節點時,其左子樹節點個數為0,右子樹節點個數為n-1,同理當2為根節點時,其左子樹節* 點個數為1,右子樹節點為n-2,所以可得G(n) = G(0)*G(n-1)+G(1)*G(n-2)+...+G(n-1)*G(0)* */public int numTrees(int n) {/* 從1到i分別為頭節點組成的二叉搜索樹的個數為dp[i] */int[] dp = new int[n + 1];dp[0] = 1;/* 分別以1為根節點,以2為根節點...依次類推,統計所有情況 */for(int i = 1;i <= n;i ++){/* 當以i為根節點時,有i-1種情況:分別對應左子樹的數量為0,1...i-1 */for(int j = 0;j < i;j ++){dp[i] += dp[j] * dp[i - j - 1];}}return dp[n];}
}

開始進入動態規劃經典題目:背包問題

9.分割等和子集(力扣416)

做這道題需要做一個等價轉換,即:
是否可以從輸入數組中挑選出一些正整數,使得這些數的和 等于 整個數組元素的和的一半。

// 1、二維數組
class Solution {/* 以可取的數字做為物品,以一半和做為容量,即轉化為01背包問題:*  求背包在給定數字下的最大可裝量,再和目標值作比較*/public boolean canPartition(int[] nums) {if (nums == null || nums.length == 0){return false;}/* 求總和 */int sum = 0;for(int num : nums){sum += num;}/* 總和不能均分為兩份 */if (sum % 2 != 0){return false;}int target = sum / 2;int len = nums.length;/* dp[i][j]代表可裝物品為nums[0]-nums[i](因此dp數組一維長度初始化為len),* 背包容量為j的情況下,背包內容量的最大價值 */int[][] dp = new int[len][target + 1];for (int j = 0; j <= target; j++) {if (j >= nums[0]){dp[0][j] = nums[0];}}for (int i = 1; i < len; i++) {for (int j = 0; j <= target; j++) {if (j >= nums[i]){dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);} else {dp[i][j] = dp[i - 1][j];}}}/* 判斷最大值是否等于目標值 */return dp[len - 1][target] == target;}
}

畫圖分析
在這里插入圖片描述發現此時dp[len - 1][target]剛好為11,返回為true

//2.動態規劃(一維數組)public boolean canPartition(int[] nums) {if(nums == null || nums.length == 0) return false;int len = nums.length;int sum = 0;for(int i : nums){sum += i;}if(sum % 2 != 0) return false;
//        dp[j]表示 背包總容量是j,最大可以湊成j的子集總和為dp[j]int[] dp = new int[sum / 2 + 1];for(int i = 0;i < len;i ++){for(int j = sum / 2;j >= nums[i];j --){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);}}return dp[sum / 2] == sum / 2;}

對于2這種一維數組解法
在這里插入圖片描述
遍歷j的時候要從后往前遍歷,因為從后往前遍歷時,dp[j]的改變不會影響dp[j-nums[i]];但是如果是從前往后遍歷,dp[j - nums[i]]會影響dp[j]的值,從而出錯

10.最后一塊石頭的重量 II(力扣1049)

此題和力扣416的思路一樣

//1.動態規劃(二維數組)public int lastStoneWeightII(int[] stones) {if(stones == null || stones.length == 0) return 0;int len = stones.length;int sum = 0;for(int i : stones){sum += i;}int target = sum / 2;//dp[i][j]:從stones[0]到stones[i]這些石頭中選擇放入容量為//j的背包中,使得背包容納的石頭的重量最大int[][] dp = new int[len][target + 1];for(int j = 0;j <= target;j ++){if(j >= stones[0]){dp[0][j] = stones[0];}}for(int i = 1;i < len;i ++){for(int j = 0;j <= target;j ++){if(j < stones[i]){dp[i][j] = dp[i - 1][j];}else{dp[i][j] = Math.max(dp[i - 1][j],dp[i - 1][j - stones[i]] + stones[i]);}}}return sum - dp[len - 1][target] - dp[len - 1][target];}
//2.動態規劃(一維數組)public int lastStoneWeightII2(int[] stones) {if(stones == null || stones.length == 0) return 0;int len = stones.length;int sum = 0;for(int i : stones){sum += i;}int target = sum / 2;int[] dp = new int[target + 1];for(int i = 0;i < len;i ++){for(int j = target;j >= stones[i];j --){//容量為j的背包所能放下的最大石頭重量dp[j] = Math.max(dp[j],dp[j - stones[i]] + stones[i]);}}return sum - dp[target] - dp[target];}

11.目標和(力扣494)

這次和之前遇到的背包問題不一樣了,之前都是求容量為j的背包,最多能裝多少。
本題則是裝滿背包有幾種方法。其實這就是一個組合問題了。
在求裝滿背包有幾種方法的情況下,遞推公式一般為dp[j] += dp[j - nums[i]];

//1.動態規劃(一維數組)public int findTargetSumWays2(int[] nums, int target) {if(nums == null || nums.length == 0) return 0;int len = nums.length;int sum = 0;for(int i : nums){sum += i;}if((sum + target) % 2 == 1) return 0;int size = (target + sum) / 2;if(size < 0) size = -size;//dp[j]:填滿j(包括j)這么大容積的包,有dp[j]種方法int[] dp = new int[size + 1];dp[0] = 1;for(int i = 0;i < len;i ++){for(int j = size;j >= nums[i];j --){dp[j] += dp[j - nums[i]];}}return dp[size];}

12.一和零(力扣474)

//1.動態規劃(三維數組)public int findMaxForm(String[] strs, int m, int n) {if(strs == null || strs.length == 0) return 0;int len = strs.length;//dp[i][m][n]:從strs[0]到strs[i]中選取子集,使得子集中最多有m個0和n個1//的最大子集的長度int[][][] dp = new int[len + 1][m + 1][n + 1];for(int i = 1;i <= len;i ++){int[] cur = caculateOneAndZero(strs[i - 1]);for(int j = 0;j <= m;j ++){for(int k = 0;k <= n;k ++){dp[i][j][k] = dp[i - 1][j][k];int zeros = cur[0];int ones = cur[1];if(j >= zeros && k >= ones){//判斷當前元素要不要放入背包,如果不放入,保持原樣,如果放入,比較原樣和加上當前元素之后哪個子集更長dp[i][j][k] = Math.max(dp[i - 1][j][k],dp[i - 1][j - zeros][k - ones] + 1);}}}}return dp[len][m][n];}public int[] caculateOneAndZero(String s){int[] res = new int[2];for(char c : s.toCharArray()){res[c - '0'] ++;}return res;}
//2.動態規劃(空間優化)public int findMaxForm2(String[] strs, int m, int n) {if(strs == null || strs.length == 0) return 0;int len = strs.length;//dp[m][n]:從strs[0]到strs[i]中選取子集,使得子集中最多有m個0和n個1//的最大子集的長度int[][] dp = new int[m + 1][n + 1];for(int i = 0;i < len;i ++){int[] cur = caculateOneAndZero(strs[i]);int zeros = cur[0];int ones = cur[1];//后兩維都是倒序for(int j = m;j >= zeros;j --){for(int k = n;k >= ones;k --){dp[j][k] = Math.max(dp[j][k],dp[j - zeros][k - ones] + 1);}}}return dp[m][n];}public int[] caculateOneAndZero(String s){int[] res = new int[2];for(char c : s.toCharArray()){res[c - '0'] ++;}return res;}

13.零錢兌換 II(力扣518)

完全背包問題求不同組合的個數:
先遍歷物品,再遍歷背包;

//1.動態規劃(一維數組)public int change(int amount, int[] coins) {if(coins == null || coins.length == 0) return 0;int len = coins.length;//dp[i]:從coins[0]到coins[i]中選取組合,使得總和為amount的不同組合的個數int[] dp = new int[amount + 1];//因為后續dp數組的結果都起于dp[0],所以初始化為1dp[0] = 1;for(int i = 0;i < len;i ++){for(int j = coins[i];j <= amount;j ++){//求個數要累積之前的所有情況dp[j] += dp[j - coins[i]];}}return dp[amount];}

好了,繼續之前的問題,這里的內外循環能換嗎?
顯然不能,因為我們這里定義的子問題是,必須選擇第k個硬幣時,湊成金額i的方案。如果交換了,我們的子問題就變了,那就是對于金額 i, 我們選擇硬幣的方案。

14.組合總和 Ⅳ(力扣377)

完全背包問題求不同排列的個數:
先遍歷背包,再遍歷物品;

//1.動態規劃(完全背包求排列總個數)一維數組public int combinationSum4(int[] nums, int target) {if(nums == null || nums.length == 0) return 0;int len = nums.length;//dp[i]:滿足總合為i的所有組合的個數(題意中表示的是排列的所有情況)int[] dp = new int[target + 1];dp[0] = 1;//排列個數問題,先遍歷背包,再遍歷物品//每一次遍歷,確定了容量,去找物品for(int j = 0;j <= target;j ++){for(int i = 0;i < len;i ++){if(j >= nums[i]){dp[j] += dp[j - nums[i]];}}}return dp[target];}

15.爬樓梯(力扣70)

//1.動態規劃(一維數組)public int climbStairs(int n) {int[] nums = {1,2};//從nums[0]到nums[i]中選取組合,使得總和為n的所有排列的總數目int[] dp = new int[n + 1];dp[0] = 1;for(int j = 0;j <= n;j ++){for(int i = 0;i < nums.length;i ++){if(j >= nums[i]){dp[j] += dp[j - nums[i]];}}}return dp[n];}
//2.動態規劃public int climbStairs(int n) {int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for(int i = 2;i <= n;i ++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}//當然此題也可以像斐波那契數列一樣將數組替換為變量

16.零錢兌換(力扣322)

  1. dp[j] = Math.max(dp[j],dp[j - coins[i]] + 1);
    如果求最大個數,數組初始化為0;使得dp[j]能夠及時更新,防止被dp[j]原來的值覆蓋
    2.如果求最小個數,數組初始化為Integer.MAX_VALUE;原因也是防止被覆蓋
public int coinChange(int[] coins, int amount) {if(coins == null || coins.length == 0) return -1;int len = coins.length;int[] dp = new int[amount + 1];for(int j = 0;j <= amount;j ++){dp[j] = Integer.MAX_VALUE;}dp[0] = 0;for(int i = 0;i < len;i ++){for(int j = coins[i];j <= amount;j ++){if(dp[j - coins[i]] != Integer.MAX_VALUE){dp[j] = Math.min(dp[j],dp[j - coins[i]] + 1);}}}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}

17.完全平方數(力扣279)

public int numSquares(int n) {int maxIndex = (int)Math.sqrt(n) + 1;int[] weight = new int[maxIndex];for(int i = 1;i <= maxIndex;i ++){weight[i - 1] = i * i;}int[] dp = new int[n + 1];for(int i = 0;i <= n;i ++){dp[i] = Integer.MAX_VALUE;}dp[0] = 0;for(int i = 0;i < weight.length;i ++){for(int j = weight[i];j <= n;j ++){dp[j] = Math.min(dp[j],dp[j - weight[i]] + 1);}}return dp[n];}

18.單詞拆分(力扣139)

//1.動態規劃(一維數組)public boolean wordBreak(String s, List<String> wordDict) {//valid[j]:長度為j的字符串能否由wordDict中的字符串組成boolean[] valid = new boolean[s.length() + 1];//數組初始化為falseArrays.fill(valid,false);//valid[0]初始化為0,其他結果由valid[0]推出valid[0] = true;for(int i = 1;i <= s.length();i ++){for(int j = 0;j < i;j ++){if(wordDict.contains(s.substring(j,i)) && valid[j]){valid[i] = true;}}}return valid[s.length()];}

19.打家劫舍(力扣198)

//1.動態規劃(一維數組)public int rob(int[] nums) {if(nums == null || nums.length == 0) return 0;int len = nums.length;//dp[i]:考慮下標i(包括i)以內的房屋,最多可以偷竊的金額為dp[i]。int[] dp = new int[len + 1];dp[1] = nums[0];for(int i = 2;i <= len;i ++){dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i - 1]);}return dp[len];}

20.打家劫舍 II(力扣213)

//1.動態規劃(一維數組)public int rob(int[] nums) {if(nums == null || nums.length == 0) return 0;if(nums.length == 1) return nums[0];if(nums.length == 2) return Math.max(nums[0],nums[1]);//因為首尾不能同時取,將nums分成兩部分,返回兩部分的最大值中的較大值return Math.max(robRange(nums,0,nums.length - 2),robRange(nums,1,nums.length - 1));}//下面也可以使用變量代替數組進行空間優化public int robRange(int[] nums,int start,int end){int len = end - start + 1;int[] dp = new int[len];dp[0] = nums[start];dp[1] = Math.max(nums[start],nums[start + 1]);for(int i = 2;i < len;i ++){dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i + start]);}return dp[len - 1];}

21.打家劫舍 III(力扣337)

//1.遞歸(超出時間限制)public int rob(TreeNode root) {if(root == null){return 0;}int money = root.val;if(root.left != null){money += (rob(root.left.left) + rob(root.left.right));}if(root.right != null){money += (rob(root.right.left) + rob(root.right.right));}//兩種情況,當前節點取和不取return Math.max(money,rob(root.left) + rob(root.right));}
//2.樹形動態規劃public int rob2(TreeNode root) {int[] ans = robAction(root);//最終取 當前節點取和不取的最大值return Math.max(ans[0],ans[1]);}public int[] robAction(TreeNode root){//res[0]:當前節點不取時獲得的最大金額//res[1]:當前節點取時獲得的最大金額int[] res = new int[2];if(root == null) return res;int[] left = robAction(root.left);int[] right = robAction(root.right);//當前節點不取,最大值 = (左孩子取和不取的最大值) + (右孩子取和不取的最大值)res[0] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);//當前節點取,最大值 = 左孩子不取 + 右孩子不取 + 當前節點的值res[1] = left[0] + right[0] + root.val;return res;}

買賣股票問題總結:共有六個股票相關問題
1.只能買賣一次
2.可以買賣多次
3.最多買賣兩次
4.最多買賣k次
5.買賣多次,賣出有一天冷凍期
6.買賣多次,每次有手續費

做股票問題時一定要注意定義的是第i天處于j狀態,這個狀態有可能是之前延續過來的,也有可能是今天才變為這個狀態,理解這一點很重要

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32】HAL庫中的實現(九):SPI(串行外設接口)

SPI 接口通信原理 SPI&#xff08;Serial Peripheral Interface&#xff09;是全雙工主從通信協議&#xff0c;特點是&#xff1a; 信號線功能SCK串行時鐘MOSI主設備輸出&#xff0c;從設備輸入MISO主設備輸入&#xff0c;從設備輸出CS&#xff08;NSS&#xff09;片選信號&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基礎配置 1.1 設置用戶名和郵箱 git config --global user.name "你的名字" git config --global user.email "你的郵箱"1.2 查看配置 git config --list二、倉庫管理 2.1 初始化本地倉庫 git init2.2 克隆遠程倉庫 git clone <倉庫…

詳解flink table api基礎(三)

文章目錄1.使用flink的原因&#xff1a;2. Flink支持兩種模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select語句&flink table api&#xff1a;6. 使用flink table api 創建table7. 使用flink table api 寫流式數據輸出到表或sink8.…

Vue2+Vue3前端開發_Day5

參考課程: 【黑馬程序員 Vue2Vue3基礎入門到實戰項目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定義指令 基本語法&#xff08;全局 & 局部注冊&#xff09; 介紹&#xff1a;自己定義的指令&#xff0c;可以封裝一些 DOM 操作&#xff0c…

機器學習--決策樹2

目錄 第一代裁判&#xff1a;ID3 與信息增益的 “偏愛” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指數” 新思路 遇到連續值&#xff1f;先 “砍幾刀” 再說 給決策樹 “減肥”&#xff1a;剪枝的學問 動手試試&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一個用于快速創建React項目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等現代前端技術棧&#xff0c;幫助開發者快速搭建高質量的React應用。 快速入門 快速入門部分將指導您如何安裝yggjs_react工具、創建新項目并啟動開發服務器。 安…

vulhub可用的docker源

這一塊不太容易找&#xff0c;我試了好幾個源&#xff0c;下面是20250820測試可用源 編輯方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置內容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

基于YOLOv8-SEAttention與LLMs融合的農作物害蟲智能診斷與防控決策系統

1. 引言 1.1 研究背景與意義 農作物蟲害是制約農業產量與質量的重要因素。據FAO報告&#xff0c;全球每年因病蟲害造成的糧食損失高達 20%–40%。傳統人工巡查與經驗診斷具有時效性差、成本高與專業人才不足等缺陷。近年來&#xff0c;計算機視覺特別是目標檢測技術在農業檢測…

從零開始構建GraphRAG紅樓夢知識圖譜問答項目(三)

文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站從零開始構建一個基于GraphRAG的紅樓夢項目 第三集01 搭建后端服務 創建一個python文件server.py 完整源碼放到文章最后了。 1.1 graphrag 相關導入 # GraphRAG 相關導入 from graphrag.query.cont…

S32K328(Arm Cortex-M7)適配CmBacktrace錯誤追蹤

CmBacktrace 相當于重寫了hard_fault函數&#xff0c;在hard_fault函數里面去分析SCB寄存器的信息和堆棧信息&#xff0c;然后把這些信息打印出來(或者寫到flash)&#xff1b;通過使用串口輸出產生hard_fault的堆棧信息&#xff0c;然后利用addr2line工具反推出具體的代碼執行函…

AI研究引擎的簡單技術實現步驟

產品愿景與核心功能 1.1 產品使命 “洞見 Weaver”是一個全棧AI Web應用,旨在將用戶的復雜研究問題,通過AI驅動的動態思維導圖和結構化報告,轉化為一次沉浸式的、可追溯的視覺探索之旅。我們的使命是,將AI復雜的推理過程透明化,將人類的探索直覺與AI的分析能力無縫結合,…

open webui源碼分析5-Tools

本文從最簡單的時間工具入手&#xff0c;分析Tools相關的代碼。一、安裝工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 進入時間工具目錄 cd servers/timepip install -r requirements.txt# 啟動服務 uvicorn main:app --host 0.0.0.0 --r…

windows下通過vscode遠程調試linux c/cpp程序配置

windows下通過vscode遠程調試linux c/cpp程序配置vscode插件配置linux依賴工具安裝launch.json配置vscode插件配置 CodeLLDB插件需要提前下載&#xff1a; linux依賴工具安裝 sudo apt update sudo apt install cmake clangdlaunch.json配置 {"version": "0…

IDEA報JDK版本問題

解決思路&#xff1a;1.找到配置jdk的IDEA配置位置settings和project structure2.先配置setting3.再修改項目結構

VirtualBox 安裝 Ubuntu Server 系統及 Ubuntu 初始配置

文章目錄簡介VirtualBoxUbuntu Server 簡介Ubuntu Server 下載安裝 Ubuntu Server首選項配置導入系統鏡像配置系統用戶配置內存 CPU 虛擬硬盤開始安裝 Ubuntu安裝完成登錄系統配置網絡Ubuntu 系統配置安裝常用工具安裝 SSH設置 root 密碼配置 IP 地址&#xff08;推薦自動分配I…

Milvus 可觀測性最佳實踐

Milvus 介紹 Milvus 是一個開源的向量數據庫&#xff0c;專為處理大規模、高維度向量數據而設計&#xff0c;廣泛應用于人工智能、推薦系統、圖像檢索、自然語言處理等場景。它支持億級向量的高效存儲與快速檢索&#xff0c;內置多種相似度搜索算法&#xff08;如 HNSW、IVF、…

arcgis-空間矯正工具(將下發數據A的信息放置原始數據B的原始信息并放置到成果數據C中,主要按下發數據A的范圍)

正常來說&#xff0c;可以直接相交獲取&#xff0c;但是會存在原始數據B將下發數據A進行分割&#xff0c;所以相交功能會導致最終成果會產生稀碎圖斑及圖斑切割&#xff0c;因此&#xff0c;經學習了解&#xff0c;學會此方法進行既保留原始數據B的信息&#xff0c;又按下發數據…

MySQL深分頁慢問題及性能優化

在數據驅動的應用中&#xff0c;分頁是不可或缺的功能。然而&#xff0c;當數據量達到百萬甚至千萬級別時&#xff0c;傳統基于 LIMIT OFFSET 的分頁方式會遭遇嚴重的性能瓶頸&#xff0c;即“深分頁”問題。本文將剖析其根源并提供主流的優化策略。問題根源&#xff1a;LIMIT …

漫談《數字圖像處理》之平滑

在數字圖像處理中&#xff0c;平滑&#xff08;Smoothing&#xff09; 的核心目標是降低圖像噪聲、模糊細節或簡化紋理&#xff0c;本質是通過 “局部鄰域運算” 對像素值進行 “平均化” 或 “規整化”&#xff0c;讓圖像整體更 “平緩”。形態學平滑與高斯平滑、均值平滑等其…

機器學習之數據預處理學習總結

在機器學習中&#xff0c;數據預處理是模型訓練前至關重要的環節&#xff0c;直接影響模型的性能和準確性。通過本次學習&#xff0c;我系統掌握了數據預處理的核心方法與工具&#xff0c;現將主要內容總結如下&#xff1a;一、缺失值處理缺失值是實際數據中常見的問題&#xf…