【面试突击算法第三天】剑指offer + Leetcode Hot100

2022年6月25日亮剑计划正式启动,直到8月初,每天回顾5道算法题,我选择的题目是剑指offer和leetcodehot100,因为这些题目基本上都是面试常考题,后面在面试之前可以多看看面经,熟悉一下每个公司对应的考过的算法题就行了

剑指 Offer 13. 机器人的运动范围

  • 题意:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
  • 示例:
    输入:m = 2, n = 3, k = 1
    输出:3
    
  • 思路:套岛屿路径的模板,本题可以和剑指offer12进行对比,那一题在搜索的过程中是需要在回溯的过程中将visited[i][j]=false,因为我们是从任意一点重新出发,而本题是规定了从(0,0)点出发,所以只要走过了就不会再走第二次,因此就不需要置为false。 关键点就是这
  • 代码:
    class Solution {
          
          
        public int movingCount(int m, int n, int k) {
          
          
            boolean[][] visited = new boolean[m][n];
            return dfs(m, n, k, visited, 0, 0);
        } 
        private int dfs(int m, int n, int k, boolean[][] visited, int i, int j) {
          
          
            if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j])
                return 0;
            if (getSum(i) + getSum(j) > k)
                return 0;
            visited[i][j] = true;
            return dfs(m, n, k, visited, i - 1, j) +
                    dfs(m, n, k, visited, i + 1, j) +
                    dfs(m, n, k, visited, i, j - 1) +
                    dfs(m, n, k, visited, i, j + 1) + 1;
        }
        private int getSum(int a) {
          
          
            int sum = 0;
            while (a != 0) {
          
          
                sum += a % 10;
                a /= 10;
            }
            return sum;
        }
    }
    

剑指 Offer 14- I. 剪绳子

  • 题意:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
  • 示例:
    输入: 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1
    
  • 思路:
  • 代码:

猜你喜欢

转载自blog.csdn.net/qq_42397330/article/details/125492882