LeetCode今日刷题2021/07/01

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?
在这里插入图片描述

示例:

输入:m = 7, n = 3
输出:28
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
  // 创建一个二维数组,通过二维数组存储到达每一个位置的不同路径数
  const memo = [];
  for(let row = 0; row < m; row++) {
    memo.push([]);
  }
  // 第一列数值为1
  for(let row = 0; row < m; row++) {
    memo[row][0] = 1;
  }
  // 第一行数值为1
  for(let col = 0; col < n; col++) {
    memo[0][col] = 1;
  }
  // 遍历数组,每一个位置所能够到达的路径数等于其上方位置与左侧位置的路径数之和(动态规划)
  for(let row = 1; row < m; row++) {
    for(let col = 1; col < n; col++) {
      memo[row][col] = memo[row - 1][col] + memo[row][col - 1];
    }
  }
  // 结果返回右下角终点的路径数
  return memo[m - 1][n - 1];
};

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
  for(let i = digits.length - 1; i >= 0; i--) {
    if(digits[i] !== 9) {
      digits[i]++;
      return digits;
    } else {
      digits[i] = 0;
    }
  }
  // 考虑每一位都是9的情况
  return [1, ...digits];
  // return [1].concat(digits);
};

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
  const memo = [];
  memo[1] = 1;
  memo[2] = 2;
  for(let i = 3; i <= n; i++) {
  	// 动态规划,到第i个台阶的方法数等于到第i-2个台阶的方法数 + 到第i-2个台阶的方法数
    memo[i] = memo[i - 1] + memo[i - 2];
  }
  return memo[n];
};

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

示例:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
  let firstColHasZero = false;
  let firstRowHasZero = false;
  // 检查第一列是否有0
  for (let i = 0; i < matrix.length; i++) {
    if (matrix[i][0] === 0) {
      firstColHasZero = true;
    }
  }
  // 检查第一行是否有0
  for (let i = 0; i < matrix[0].length; i++) {
    if (matrix[0][i] === 0) {
      firstRowHasZero = true;
    }
  }
  // 使用第一行和第一列,来标记其余行列是否含有0
  for (let row = 1; row < matrix.length; row++) {
    for (let col = 1; col < matrix[0].length; col++) {
      if (matrix[row][col] === 0) {
        matrix[row][0] = 0;
        matrix[0][col] = 0;
      }
    }
  }
  // 接下来,利用第一行和第一列的标0情况,将matrix中的数字标0
  for (let row = 1; row < matrix.length; row++) {
    for (let col = 1; col < matrix[0].length; col++) {
      if (matrix[row][0] === 0 || matrix[0][col] === 0) {
        matrix[row][col] = 0;
      }
    }
  }
  // 最后,处理第一行和第一列
  // 如果firstColHasZero等于true,将第一列全设为0
  if (firstColHasZero) {
    for (let i = 0; i < matrix.length; i++) {
      matrix[i][0] = 0;
    }
  }
  // 如果firstRowHasZero等于true,将第一行全设为0
  if (firstRowHasZero) {
    for (let i = 0; i < matrix[0].length; i++) {
      matrix[0][i] = 0;
    }
  }
  return matrix;
};

83. 删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

示例:

输入:head = [1,1,2,3,3]
输出:[1,2,3]
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
  let p = head;
  while(p !== null && p.next !== null) {
    if(p.val === p.next.val) {
      p.next = p.next.next;
    } else {
      p = p.next;
    }
  }
  return head;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值