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
- 思路:
- 代码: