[leetcode]不同路徑三連擊~

来源:https://www.cnblogs.com/cnyball/archive/2019/07/17/11198458.html
-Advertisement-
Play Games

題目 不同路徑 1 一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 問總共有多少條不同的路徑? 輸入說明 例如,上圖是一個 7 x 3 的網格。有多少可能的路 ...


題目 不同路徑 1

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?

輸入說明

例如,上圖是一個 7 x 3 的網格。有多少可能的路徑?

說明:m 和 n 的值均不超過 100。

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

分析

這題我第一眼就是想到 dp 23333,既然機器人只能向下或者向右,那麼哪一步可以到達右下角呢?

只能是右下角的上邊或者左邊走一步,是吧,那麼假設 f(n,m) 是最後一步的路徑數則是上邊 f(n-1,m) 加左邊 f(n,m-1)

即:

f(n,m)=f(n-1,m)+f(n,m-1)

而第一行和第一列因為只有一種方向所以都是 1 ~~

代碼還用寫?

要的

直觀一點套公式走起

 int uniquePaths(int m, int n) {
        if(m==1 || n==1) return 1;
        int nums[m][n];
        for(int i=0; i<n; i++){
            nums[0][i] = 1;
        }
        for(int i=0; i<m; i++){
            nums[i][0] = 1;
        }

        for(int i=1; i<m; i++)
            for(int j=1; j<n; j++){
                nums[i][j] = nums[i][j-1] + nums[i-1][j];
            }
        return nums[m-1][n-1];
    }

時間複雜度:O(m*n)

空間複雜度:O(m*n)

在這裡我們是使用了二維數組來記錄每一行的路徑,但是我們真的需要每一行的路徑記錄嗎?

所以我想了一下改成一維數組:

 int uniquePaths(int m, int n) {
       int nums[n];
      for (int i = 0; i < n; i++) {
          nums[i] = 1;
      }

      for (int i = 1; i < m; i++) {
          for (int j = 1; j < n; j++) {
              nums[j] = nums[j] + nums[j - 1];
          }
      }
      return nums[n - 1];
  }

時間複雜度:O(m*n)

空間複雜度:O(n)

能看懂嗎?

應該不用解釋了吧 0.0

再度分析:另一種解法

那麼如果只能向下或者向右,而都是從左上角走到右下角,意味著機器人向下和向右都是固定的次數

即是向下 m-1 步,向右 n-1 步,總共走了 c = m+n-2 步
那麼總是向右和向下的組合,是不是直接使用排列組合的組合公式求出就行了呢,23333

ps:其實想寫出公式的,但是不怎麼會用math格式 orz

馬上來試試!!

  int uniquePaths(int m, int n) {
      int d = m - 1; //向下的步數
      int c = n + m - 2;  //總共的步數
      long num = 1; //結果,乘法累計所以初始化1
      for (int i = 1; i <= d; i++)
        num = num * (c - d + i) / i;
      return (int) num;
  }

時間複雜度:O(m)

空間複雜度:O(1)

完美 233

後面還有兩道題目修改的 2 、3 所以未完待續.....

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SRP = Single Responsibility Principle 定義:就一個類而言,應該只有一個能引起他變化的原因。通俗的說,即一個類只負責一項職責。 作用: 1、減少了類之間的耦合 2、最簡單最單純的事情才是最容易控制,最有效 3、當需求變化時,只需要修改一個地方 4、 避免寫臃腫的方 ...
  • Spring Cloud Alibaba | Nacos集群部署 [TOC] 1. Nacos支持三種部署模式 單機模式 用於測試和單機試用。 集群模式 用於生產環境,確保高可用。 多集群模式 用於多數據中心場景。 以上是官方提供的三種部署方式:單機模式對於企業來講,僅可用於測試環境或者開發環境,不 ...
  • <?phpclass db{ public $table=null; public $pdo; public $where=null; //where 條件 public $field=null; //要查詢的條件 public function __construct() { $this->pdo ...
  • Spring Cloud Alibaba | Nacos配置管理 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列文章全採用以上版本 [TOC] 上一篇 "《Spring Cloud Alibaba | Nacos服務註冊 ...
  • 解壓壓縮包會有一個種子文件。直接迅雷下載即可,包含了韓順平老師的java入門視頻,jdbc,jsp,servlet,oracle,hibermate,spring,SHH框架,struct,linux,等十套視頻,並且還包含了配套的源碼。迅雷下載速度很快。20兆的寬頻下載速度大概是2.3MB/s,沒 ...
  • vector 是最簡單、最常用的數據存儲形式。 vector 似乎一組可以通過索引來訪問的順序存儲的數據元素。 我們可以用 vector 名和索引號的組合來表示一個具體的數據元素 例如:v[0]是5,v[1]是7。 vector 的索引號總是從“0”開始,每次加1. vector “知道自己的大小” ...
  • 經過接近1個月的時間,ElasticSearch6.x實戰教程終於成冊。這本實戰教程小冊有很多不足(甚至可能有錯誤),也是第一次完整推出一個系列的教程。 1年前,我開始真正接觸ES,在此之前僅停留在知道的階段,甚至連瞭解都算不上。1年後跳槽,新的知識新的領域爆炸式的噴涌而出,分散式、ES、Redis ...
  • 消費組和消費者 1. 消費組和消費者是一對多的關係。 2. 同一個消費組的消費者可以消費多個分區,且是獨占的。 3. 消費者的分區分配策略由介面 定義,內置三種分配策略 、`RoundRobinAssignor StickyAssignor`,支持自定義策略。 4. 不同消費組可以消費相同的分區,互 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...