1、最小路径和
//给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 // // 说明:每次只能向下或者向右移动一步。 // // // // 示例 1: // // //输入:grid = [[1,3,1],[1,5,1],[4,2,1]] //输出:7 //解释:因为路径 1→3→1→1→1 的总和最小。 // // // 示例 2: // // //输入:grid = [[1,2,3],[4,5,6]] //输出:12 // // // // // 提示: // // // m == grid.length // n == grid[i].length // 1 <= m, n <= 200 // 0 <= grid[i][j] <= 100 // // Related Topics 数组 动态规划
这个题我们需要一个个计算到达矩阵中每个点的最短路径,这样一来到最后那个点自然是最小的,所以我们新建一个数组dp[][]来计算到每个点的最短路径之和,这样我们再管每一个点,在边缘的点,因为只能向右和向下走,所以dp[0][j]=dp[0][j-1]+matrix[0][j],dp[i][0]=dp[i-1][0]+matrix[i][0],而在中间的点我们需要考虑是从上还是从左来的路径短,所以我们取最小值,dp[i][j]=Math.min(dp[i][j-1],dp[i-1][j])+matrix[i][j]这样来确定它的最短路径。
public int minPathSum(int[][] grid) {
//dp[i][0] = dp[i-1][0]+grid[i][0]
//dp[0][j] = dp[0][j-1]+grid[0][j]
//dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])+grid[i][j]
if(grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
}
int rows = grid.length;
int cols = grid[0].length;
int[][] dp = new int[rows][cols];
dp[0][0] = grid[0][0];
for (int i = 1; i < rows; i++) {
dp[i][0] = dp[i-1][0]+grid[i][0];
}
for (int j = 1; j < cols; j++) {
dp[0][j] = dp[0][j-1]+grid[0][j];
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[rows-1][cols-1];
}
2、颜色分类(L75)
//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 // // 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 // // // // // // // 示例 1: // // //输入:nums = [2,0,2,1,1,0] //输出:[0,0,1,1,2,2] // // // 示例 2: // // //输入:nums = [2,0,1] //输出:[0,1,2] // // // 示例 3: // // //输入:nums = [0] //输出:[0] // // // 示例 4: // // //输入:nums = [1] //输出:[1] // // // // // 提示: // // // n == nums.length // 1 <= n <= 300 // nums[i] 为 0、1 或 2 // // // // // 进阶: // // // 你可以不使用代码库中的排序函数来解决这道题吗? // 你能想出一个仅使用常数空间的一趟扫描算法吗? // // Related Topics 排序 数组 双指针
这道题我懒的想了,直接用选择排序:
public void sortColors(int[] nums) {
//普通选择排序
for (int i = 0; i < nums.length - 1; i++) {
int min = nums[i];
for (int j = i; j<nums.length; j++) {
if(nums[j] < min){
min = nums[j];
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
}
}