zoukankan      html  css  js  c++  java
  • [Swift]LeetCode62. 不同路径 | Unique Paths

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9921029.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    How many possible unique paths are there?


    Above is a 7 x 3 grid. How many possible unique paths are there?

    Note: m and n will be at most 100.

    Example 1:

    Input: m = 3, n = 2
    Output: 3
    Explanation:
    From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
    1. Right -> Right -> Down
    2. Right -> Down -> Right
    3. Down -> Right -> Right
    

    Example 2:

    Input: m = 7, n = 3
    Output: 28

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

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

    问总共有多少条不同的路径?

    例如,上图是一个7 x 3 的网格。有多少可能的路径?

    说明:m 和 的值均不超过 100。

    示例 1:

    输入: m = 3, n = 2
    输出: 3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。
    1. 向右 -> 向右 -> 向下
    2. 向右 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向右
    

    示例 2:

    输入: m = 7, n = 3
    输出: 28

    8ms
     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         if m == 0 || n == 0 {
     4             return 0
     5         }
     6         var columns: [Int] = Array(repeating: 1, count: m)
     7         for _ in 1..<n { // 逐行遍历
     8             for i in 1..<m { // 第一位, 始终只有1种(+0)
     9                 columns[i] += columns[i-1]
    10             }
    11         }
    12         return columns.last!
    13     }
    14 }

    8ms

     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         var pathNums = Array(repeating: Array(repeating:0,count: n),count: m)
     4         return _helper(&pathNums, m - 1, n - 1)
     5     }
     6     private func _helper(_ pathNums: inout [[Int]], _ m: Int, _ n: Int) -> Int {
     7         if m < 0 || n < 0 {
     8             return 0
     9         }
    10         if m == 0 || n == 0 {
    11             return 1
    12         }
    13         
    14         if pathNums[m][n] != 0 {
    15             return pathNums[m][n]
    16         }
    17         pathNums[m][n] = _helper(&pathNums, m - 1, n) + _helper(&pathNums, m, n - 1)
    18         
    19         return pathNums[m][n]
    20     }
    21 }

    12ms

     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         if m == 0 || n == 0 { return 0 }
     4         var count = Array(repeating: Array(repeating: 0, count: n), count: m)
     5         var col = n-1
     6         while col >= 0 {
     7             var row = m-1
     8             while row >= 0 {
     9                 if row == m-1 && col == n-1 {
    10                     count[row][col] = 1
    11                 } else {
    12                     count[row][col] = (col < n-1 ? count[row][col+1] : 0) + (row < m-1 ? count[row+1][col] : 0)                   
    13                 }
    14                 row -= 1
    15             }
    16             col -= 1
    17         }
    18         return count[0][0]
    19     }
    20 }

    16ms

     1 class Solution {
     2     
     3     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     4         guard m > 0 else {
     5             return 0
     6         }
     7         
     8         var steps = Array(repeating: Array(repeating: 1, count: n), count: m)
     9         for row in 1..<m {
    10             for column in 1..<n {
    11                 steps[row][column] = steps[row - 1][column] + steps[row][column - 1]
    12             }
    13         }
    14         
    15         return steps[m - 1][n - 1]
    16     }
    17     
    18 }

    20ms

     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         if m == 0 || n == 0 {
     4             return 0
     5         }
     6         var map = Array(repeating: Array(repeating:0,count: n),count: m)
     7         for i in 1 ..< m {
     8             for j in 1 ..< n {
     9                 var num1 = map[i - 1][j]
    10                 var num2 = map[i][j - 1]
    11                  if i - 1 == 0 || j == 0 {
    12                     num1 = 1
    13                 }
    14                 if i == 0 || j - 1 == 0 {
    15                     num2 = 1
    16                 }
    17                 map[i][j] = num1 + num2
    18             }
    19         }
    20          if m - 1 == 0 || n - 1 == 0 {
    21             return 1
    22         } else {
    23             let result = map[m - 1][n - 1]
    24             return result
    25         }
    26     }
    27 }

    24ms

     1 class Solution {
     2     
     3     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     4         var arrs: [[Int]] = Array(repeating: Array(repeating: 0, count: n), count: m)
     5         for i in 0..<m{
     6             for j in 0..<n{
     7                 if i == 0 && j == 0{
     8                     arrs[i][j] = 1
     9                 }else if i == 0 {
    10                     arrs[i][j] = arrs[i][j-1]
    11                 }else if j == 0{
    12                     arrs[i][j] = arrs[i-1][j]
    13                 }else{
    14                     arrs[i][j] = arrs[i-1][j] + arrs[i][j-1]
    15                 }
    16             }
    17         }
    18         return arrs[m-1][n-1]
    19     }
    20 }

    32ms

     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         guard m > 1 else {
     4             return m == 0 ? 0 : 1
     5         }
     6         guard n > 1 else {
     7             return n == 0 ? 0 : 1
     8         }
     9         
    10         var path = [Int].init(repeating: 1, count: m+1)
    11         path[0] = 0
    12         for _ in 2...n {
    13             for j in 1...m {
    14                 path[j] = path[j] + path[j-1]
    15             }
    16         }
    17         print(path)
    18         return path[m]
    19     }
    20 }

    40ms

     1 class Solution {
     2     func uniquePaths(_ m: Int, _ n: Int) -> Int {
     3         let l = max(m,n)
     4         let s = min(m,n)
     5         if s==1 {
     6             return 1
     7         }
     8         // c l,s 组合
     9         var ji1 = 1
    10         var ji2 = 1
    11         for i in 1...s-1 {
    12             ji1*=i
    13             ji2*=l+s-i-1
    14         }
    15         return ji2/ji1
    16     }
    17 }
  • 相关阅读:
    liunx知识点滴积累(1)
    Regsvr32命令的使用
    QTP知识点滴积累
    LoadRunner的Apache的监控
    CMM和过程改进的“妙语” 集锦
    Linux 性能调优的几种方法
    数据库学习笔录(转载)
    Windows性能管理解析
    使用NUnit在.Net编程中进行单元测试
    Google 工程师文化 互助篇
  • 原文地址:https://www.cnblogs.com/strengthen/p/9921029.html
Copyright © 2011-2022 走看看