网格问题(回溯/DP):最短路径(排除障碍物)+路径数量+路径最大/小和+判断路径存在

2023-11-14

一、网格中的最短路径

1.1 可以消除障碍物

LeetCode1293:网格中的最短路径
给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。每一步,您都可以在空白单元格中上、下、左、右移动。如果您 最多 可以消除 k 个障碍物,请找出从左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路径,并返回通过该路径所需的步数。如果找不到这样的路径,则返回 -1。
在这里插入图片描述

class Solution {
	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();//网格的长
		int n = sc.nextInt();//网格的宽
		int k = sc.nextInt();
        
        int[][] grid = new int[m][n];

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                grid[i][j] = sc.nextInt();
            }
        }
        System.out.println(shortestPath(grid,k));
    }
    public int shortestPath(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        if(k >= m + n -3) return m + n - 2;
        boolean[][] visited = new boolean[m][n];
        int res = backtrack(grid,0,0,m,n,0,k,visited);
        return res == Integer.MAX_VALUE ? -1 : res;
    }

    public int backtrack(int[][] grid,int i,int j,int m,int n,int count,int k,boolean[][] visited){
        if(i < 0 || i >= m || j < 0 || j >= n) return Integer.MAX_VALUE;//递归出口
        if(i == m-1 && j == n-1) return count;//结果
        if(visited[i][j]) return Integer.MAX_VALUE;
        //排除障碍物
        if(grid[i][j] == 1){
            if(k > 0) k--;
            else return Integer.MAX_VALUE;
        }
        visited[i][j] = true;
        //取4个方向可能路径的最小值返回
        int min4 = Integer.MAX_VALUE;
        min4 = Math.min(min4,backtrack(grid,i-1,j,m,n,count+1,k,visited));
        min4 = Math.min(min4,backtrack(grid,i+1,j,m,n,count+1,k,visited));
        min4 = Math.min(min4,backtrack(grid,i,j-1,m,n,count+1,k,visited));
        min4 = Math.min(min4,backtrack(grid,i,j+1,m,n,count+1,k,visited));
        //回溯
        visited[i][j] = false;
        return min4;
    }
}

【法二】visited访问标记数组三维扩展 (用于比较)

本题比较麻烦些,增加了障碍物且可以有k次机会消除,单纯有障碍物就是标准的BFS处理即可,但有k次消除障碍物,就需要增加一个维度来记录同一个节点被访问的时候 已经使用消除障碍物的次数。:

链接:作者:jin-129

public int shortestPath(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        // 非法参数处理
        if (validateInputParams(k, m, n)) {
            return -1;
        }
        // 特殊场景处理
        if (m == 1 && n == 1) {
            return 0;
        }
        // BFS搜索节点访问标识, 此题要求有k个消除障碍的机会,所以每个节点除了标记是否被访问过
        // 还要记录搜索到此节点时消除了几个障碍。消除相同障碍的下一层节点 可以剪枝(因为有相同代价更早的节点了)
        // 例子:k=1, BFS是按层级来的,绕道的层级扩展越多
        // 坐标(0,2)可以为消除(0,1)障碍过来的 visited[0][2][1] = 1,搜索层级为2
        // 也可能为不消除任何障碍过来的 visited[0][2][0] = 1,层级为6,为扩展搜索不通障碍消除数提供区分
        // 0 1 0 0 0 1 0 0
        // 0 1 0 1 0 1 0 1
        // 0 0 0 1 0 0 1 0

        // 二维标记位置,第三维度标记 到此节点的路径处理障碍总个数
        int[][][] visited = new int[m][n][k+1];
        // 初始步数为0,m=n=1的特殊场景已处理
        int minSteps = 0;
        // 初始位置标记已访问
        visited[0][0][0] = 1;
        Queue<Point> queue = new LinkedList<>();
        Point startPoint = new Point(0, 0, 0);
        queue.offer(startPoint);

        // 定义四个方向移动坐标
        int[] dx = {1, -1, 0, 0};
        int[] dy = {0, 0, 1, -1};
        // BFS搜索-队列遍历
        while (!queue.isEmpty()) {
            minSteps++;
            // BFS搜索-遍历相同层级下所有节点
            // 当前队列长度一定要在循环外部定义,循环内部有插入对列操作
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                Point current = queue.poll();
                int x = current.x;
                int y = current.y;
                int oneCount = current.oneCount;

                // 对当前节点四个方向进行识别处理
                for (int j = 0; j < 4; j++) {
                    int xNew = x + dx[j];
                    int yNew = y + dy[j];
                    // 越界
                    if (xNew < 0 || xNew >= m || yNew < 0 || yNew >= n) {
                        continue;
                    }
                    // 搜索到目标节点则直接返回结果
                    if (xNew == m - 1 && yNew == n - 1) {
                        return minSteps;
                    }
                    // 穿越障碍次数已满
                    if (grid[xNew][yNew] == 1 && oneCount >= k) {
                        continue;
                    }
                    int oneCountNew = grid[xNew][yNew] == 1 ? oneCount + 1 : oneCount;
                    // 四个方向节点是否被访问过(第三维度)
                    if (visited[xNew][yNew][oneCountNew] == 1) {
                        continue;
                    } else {
                        // 未被访问过且可以走的节点标记为访问过,对下一步节点确认状态非常重要
                        // 将下一层级节点入队列标记为已访问,可以剪枝更多节点,节省计算耗时
                        visited[xNew][yNew][oneCountNew] = 1;
                    }
                    queue.offer(new Point(xNew, yNew, oneCountNew));
                }
            }
        }
        // BFS没搜索到目标,返回-1
        return -1;
    }

    private boolean validateInputParams(int k, int m, int n) {
        return m > 40 || m < 1 || n > 40 || n < 1 || k < 1 || k > m * n;
    }

    class Point {
        int x;
        int y;
        int oneCount;

        public Point(int x, int y, int oneCount) {
            this.x = x;
            this.y = y;
            this.oneCount = oneCount;
        }
    }

1.2 不能消除障碍物(走迷宫)

输入:

第一行代表迷宫地图的行列数
第二行代表起点,
第三行代表终点 后面即地图,
x代表障碍物,o代表通路。

输出:

最短路径的值,走一步 + 1

例子:

输入:
5 5
0 0
2 2
ooooo
oxxxo
oxooo
oxxxo
ooooo
输出:
8

import java.util.*;

public class Main1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();//n行
            int m = sc.nextInt();//m列

			int x1 = sc.nextInt();
            int y1 = sc.nextInt();
            int[] begin = {x1,y1};//起点
            int x2 = sc.nextInt();
            int y2 = sc.nextInt();
            int[] end = {x2,y2};  //终点
			
            //地图
            char[][] map = new char[n][m];
            String[] s = new String[n];
			for(int i = 0;i < n;i++){
				s[i] = sc.next();
			}
            for(int i = 0;i < n;i++){
                for(int j=0;j < m;j++){
                    map[i][j] = s[i].charAt(j);
                }
            }
            //System.out.println(Arrays.toString(map));
            System.out.println(bfs(map,begin,end));
        }
    }
    
    public static int bfs(char[][] map, int[] begin, int[] end) {
		//移动的四个方向
		int[] dx = {1, 0, -1, 0};
		int[] dy = {0, 1, 0, -1};
		//用来储存距离到起始点最短路径的二维数组
		int[][] d = new int [map.length][map[0].length];
		//储存未进行处理的点
		Queue<int[]> que = new LinkedList<int[]>();
		//将所有的位置都初始化为最大
		for(int i = 0; i < d.length; i++) {
			for(int j = 0; j < d[0].length; j++) {
				d[i][j] = Integer.MAX_VALUE;
			}
		}
		//将起始点放入队列
		que.offer(begin);
		//将起始点最短路径设为0
		d[ begin[0] ][ begin[1] ] = 0;
		//一直循环直到队列为空
		while(!que.isEmpty()) {
			//取出队列中最前端的点
			int[] current = que.poll();
			//如果是终点则结束
			if(current[0] == end[0] && current[1] == end[1]) break;
			//四个方向循环
			for(int i = 0; i < 4; i++) {
				//试探
				int ny = current[0] + dy[i];
				int nx = current[1] + dx[i];
				//判断是否可以走
				if(ny >= 0 && ny < d.length && nx >= 0 && nx < d[0].length && map[ny][nx] != 'x' && d[ny][nx] == Integer.MAX_VALUE) {
					//如果可以走,则将该点的距离加1
					d[ny][nx] = d[current[0]][current[1]] + 1;
					//并将该点放入队列等待下次处理
					int[] c = {ny, nx};
					que.offer(c);
					
				}
			}
		}
		return d[end[0]][end[1]];
	}
}

二、网格的路径数量——DP

LeetCode63:不同的路径
在这里插入图片描述

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        if(obstacleGrid.length==0) return 0;
        int row = obstacleGrid.length;
        int col = obstacleGrid[0].length;
        int[][] dp = new int[row][col];//走到该格的方法数
        //初始化第一行和第一列,没有障碍物就设置为1
        for(int i=0; i<row && obstacleGrid[i][0] == 0; i++){
            dp[i][0] = 1;
        }
        for(int j=0; j<col && obstacleGrid[0][j] == 0; j++){
            dp[0][j] = 1;
        }
        //递推,如果dp的左边一个和上边一个都为1,那么这格的数字就为2
        //如果左边为1,上面为0,那么这个为1,如果网格此处有阻碍,那么dp为0
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if(obstacleGrid[i][j] == 0){
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[row-1][col-1];
    }
}

三、网格路径最大和

(1)滚动数组方案(比较难想到)

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
LeetCode47:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
在这里插入图片描述

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        //滚动数组方案
        int[] dp = new int[n+1];//记录实时的求和结果
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                dp[j] = Math.max(dp[j],dp[j-1]) + grid[i-1][j-1];
            }
        }
        return dp[n];
    }
}

(2)二维数组DP

求上下位置最大的那个,加上当前位置的数,作为到达该位置的最大和,即dp[i][j]
在这里插入图片描述

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = grid;//记录棋盘中,当前位置的和
        //初始化dp
        for(int i=1;i<n;i++){//第一行挨个求和,初始化
            dp[0][i] = dp[0][i] + dp[0][i-1];
        }
        for(int j=1;j<m;j++){//第一列挨个求和,初始化
            dp[j][0] = dp[j][0] + dp[j-1][0];
        }
        
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[m-1][n-1];//到达棋盘最后一个位置的和
    }
}

四、网格路径最小和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:

输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = grid;

        for(int i=1;i<m;i++){
            dp[i][0] = dp[i-1][0] + dp[i][0];
        }

        for(int i=1;i<n;i++){
            dp[0][i] = dp[0][i-1] + dp[0][i];
        }

        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
}

五、搜索单词是否在网格中

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
原题链接:https://leetcode-cn.com/problems/word-search

示例:

board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]

给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”,返回 false

class Solution {
    public boolean exist(char[][] board, String word) {
        char[] c = word.toCharArray();
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(board[i][j]==c[0]){ //找到起点
                    if(dfs(board,i,j,c,0)){
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public boolean dfs(char[][] board,int row,int col,char[] c,int index){
        if(row < 0 || row >= board.length || col < 0 || col >= board[0].length){//递归出口
            return false;
        }
        if(index == c.length - 1 && board[row][col] == c[index]){ //成功条件
            return true;
        }
        if(board[row][col] != c[index]){
            return false;
        }

        board[row][col] = '-';//将成功匹配的位置替换为-
        boolean res = dfs(board,row,col-1,c,index+1) || dfs(board,row,col+1,c,index+1) || dfs(board,row-1,col,c,index+1) || dfs(board,row+1,col,c,index+1);
        board[row][col] = c[index];//在return前将-替换回c[index]
        return res;
    }
}

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格**。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子**。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。
[
[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]
]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false

class Solution {
    public boolean exist(char[][] board, String word) {
        if(board == null || board == null || board.length == 0 || board[0].length == 0 || word == null || word.equals("")){
            return false;
        }
        boolean[][] isVisited = new boolean[board.length][board[0].length];
        char[] c = word.toCharArray();

        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(board[i][j] == c[0]){
                    if(bfs(board,i,j,isVisited,c,0)){
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public boolean bfs(char[][] board,int i,int j,boolean[][] isVisited,char[] c,int index){
        if(index == c.length){//成功条件
            return true;
        }
        if(i<0 || j<0 || i==board.length || j==board[0].length || isVisited[i][j] || board[i][j]!=c[index]){
            return false;
        }
        isVisited[i][j] = true;
        boolean res = bfs(board,i+1,j,isVisited,c,index+1) 
                   || bfs(board,i-1,j,isVisited,c,index+1)
                   || bfs(board,i,j+1,isVisited,c,index+1)
                   || bfs(board,i,j-1,isVisited,c,index+1);
        isVisited[i][j] = false;
        return res;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网格问题(回溯/DP):最短路径(排除障碍物)+路径数量+路径最大/小和+判断路径存在 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • ExceptionConverter:java.io.IOException:文档没有页面。我正在使用 iText

    当我执行下面的代码时 File f new File c sample pdf PdfWriter getInstance document new FileOutputStream f document open System out p
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • VScode配置C/C++环境,MinGW,最新成功实例分享(win10)

    win10 VScode配置C语言 自己调试成功后 分享出来 首先下载VScode 这个十分简单 直接官网搜索最新的就行了 VScode下载官网VScode下载官网 然后安装 其中windows下支持C语言的编译 有两个好用的分别是MinG
  • 什么是Docker

    文章目录 一 什么是Docker 一 什么是Docker 微服务虽然具备各种各样的优势 但服务的拆分通用给部署带来了很大的麻烦 特别是一些大型项目组件较多 运行环境也较为复杂 部署时会碰到一些问题 依赖关系复杂 容易出现兼容性问题 分布式系
  • 简单使用matlab做回归分析、拟合分析

    简单使用matlab做回归分析 拟合分析 前言 一元线非线性回归 例子 多元线性回归 例子 多元线非线性回归 前言 这里是简单做一元非线性 及多元线性 一元 就是只有一个X 比如 y x 2 x 1 多元 就是多个X 比如 y x1 x2
  • Unity 小球在两点之间往返运动

    在Vectoer3类中有一个Lerp方法 可以让一个物体从一个点到另外一个点 如果要在 这里点加往返运动我们可以借助Mathf PingPong 这个方法 这个方法会从0 Lenght持续增加 达到最大值后 持续减小 然后到0 如此反复 每
  • 基于协同过滤算法实现选课推荐系统

    新版本教务管理系统 教务管理系统 选课功能 1 系统功能 1 用户账户管理 2 学生个人信息的查看与修改 3 学生的网上选课与课程的评分 4 教师个人信息的查看与修改 5 教师对学生课程评价结果的查看 6 管理员对学生信息与教师信息的查看与
  • 前端绘制地铁路线图

    前端绘制地铁路线图 前端可以使用多种技术绘制二维地图 以下是几种常见的方法 SVG SVG是一种基于XML的矢量图形格式 可以使用SVG元素绘制各种形状和路径 包括线 圆 多边形等 可以使用JavaScript库如D3 js来绘制SVG地图
  • 【推荐系统】{1} —— 基于用户的协同过滤算法

    协同过滤 英语 Collaborative Filtering 简称CF 简单来说是利用某兴趣相投 拥有共同经验之群体的喜好来推荐用户感兴趣的信息 个人透过合作的机制给予信息相当程度的回应 如评分 并记录下来以达到过滤的目的进而帮助别人筛选
  • 【Pytorch】Inplace operation(待完善)

    什么是Inplace操作 本质上讲 inplace操作是指将新值赋到原变量地址上的操作 目的是节约内存空间 例如inplace操作 x 1 假设原x值为0 储存在id为139973228650216的内存地址中 在进行该inplace操作后
  • 【LeetCode每日刷题】一单词长度的最大乘积

    一 题目 给定一个字符串数组 words 请计算当两个字符串 words i 和 words j 不包含相同字符时 它们长度的乘积的最大值 假设字符串中只包含英语的小写字母 如果没有不包含相同字符的一对字符串 返回 0 输入输出样例 示例1
  • LVS、Nginx、HAProxy、keepalive 的工作原理详解

    当前大多数的互联网系统都使用了服务器集群技术 集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务 这些集群可以是 Web 应用服务器集群 也可以是数据库服务器集群 还可以是分布式缓存服务器集群等等 在实际应用中 在 Web 服务
  • 阿里云ACK(容器服务)+ElasticWorkload弹性负载+HPA弹性伸缩实践

    背景 阿里云ACK kubernetes容器服务 高弹性 高稳定性 低成本解决方案 通过将ECI服务以虚拟节点的方式接入ACK容器集群 将集群中pod应用的固定量调度到现有的ACK容器服务的ECS node节点上 将集群中pod应用的弹性量
  • 测试用例要如何写

    1 测试点与测试用例 测试点不等于测试用例 这是我们首先需要认识到的 问题1 这些测试点在内容上有重复 存在冗余 问题2 一些测试点的测试输入不明确 不知道测试时要测试哪些 问题3 总是在搭相似的环境 做类似的操作 问题4 测试点描述得太粗
  • CWnd和HWND的区别

    所有控件类都是CWnd类的派生类 CWnd的所有成员函数在控件类中都可以使用 在MFC中 CWnd类是一个很重要的类 它封装了Windows的窗口句柄HWND 在Windows编程中 每一个窗口都是有窗口句柄标识的 但是 类CWnd的对象和
  • 基于ResNet50算法实现图像分类识别

    概要 在本文中将介绍使用Python语言 基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练 观察其模型训练效果 一 目录 ResNet50介绍 图片模型训练预测 项目扩展 二 ResNet50介绍 Res
  • 2020年第一碗鸡汤

    2020年第一碗鸡汤 2020年第一天 新的一年如何生活 对照下这40条 看看那些有益 关于 如何生活 英国作家马特 海格给出的40条建议 01 快乐出现的时候 享受快乐 02 小口慢饮 别狼吞虎咽 03 对自己温柔些 少工作 多休息 04
  • 计算机音乐怎么把音乐放u盘,怎么把音乐拷贝到u盘

    语音内容 大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 把音乐拷贝到u盘的方法如下 1 首先在电脑上插入u盘 2 然后打开 我的电脑 或者 计算机 找到U盘 点击打开 3 同时找到装有音乐的文件夹 长按鼠标 在弹出的选
  • 2021.11.16-17总结

    数据结构串 串是由字符组成的有序数列 相等要字符长度相等并且每一个字符相等 顺序串 非紧缩格式 每个单元一个字符 紧缩格式 每个单元多个字符 链串 每个节点存放的字符数称为节点大小 串的匹配模式 BF算法 KMP算法 KMP算法避免了主串指
  • python混合线性模型_Python Statsmodels Mixedlm(混合线性模型)随机效应

    我对Statsmodels Mixedlm的输出感到有点困惑 我希望有人可以解释一下 我有一个大型的单户住宅数据集 包括每个房产的前两个销售价格 销售日期 我对整个数据集进行了地理编码 并获取了每个属性的高程 我试图了解不同城市之间提升与房
  • React隐藏显示元素

    1 引入 2 添加布尔类型的状态变量 3 切换变量的状态值 4 给 div 赋值 给button按钮设置点击事件 这样就可以实现了 div
  • 网格问题(回溯/DP):最短路径(排除障碍物)+路径数量+路径最大/小和+判断路径存在

    一 网格中的最短路径 1 1 可以消除障碍物 LeetCode1293 网格中的最短路径 给你一个 m n 的网格 其中每个单元格不是 0 空 就是 1 障碍物 每一步 您都可以在空白单元格中上 下 左 右移动 如果您 最多 可以消除 k