1. 程式人生 > >LeetCode(120) Triangle

LeetCode(120) Triangle

題目

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle
題目
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

分析

本題類似於之前的一個障礙物的題目,用到動態規劃的思想;

分析第i層的第k個頂點的最小路徑長度表示為

f(i,k),則f(i,k)=minf(i1,k),f(i1,k1)+d(i,k); (注意每行的首尾邊界需要特殊處理)

其中d(i,k)表示原來三角形數組裡的第i行第k列的元素。

則可以求得從第一行到最終到第rows1行第k個元素的最小路徑長度,最後再比較第rows1行中所有元素的路徑長度大小,求得最小值。

題目要求:空間複雜度不要超過n。

AC程式碼

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        if
(triangle.empty()) return 0; int rows = triangle.size(); //動態規劃,由於空間複雜度要求,現利用原始二維陣列triangle改為儲存當前(i,j)位置的最小和 for (int i = 1; i < rows; ++i) { int cols = triangle[i].size(); for (int j = 0; j < cols; ++j) { //本行的第一個元素
if (0 == j) { triangle[i][j] = triangle[i][j] + triangle[i - 1][j]; } //本行的最後一個元素 else if (j == cols - 1) { triangle[i][j] += triangle[i - 1][j - 1]; } else{ triangle[i][j] = min(triangle[i][j] + triangle[i][j - 1], triangle[i][j] + triangle[i - 1][j - 1]); }//else }//for }//for //最小路徑和為最後一行的最小值 int minSum = triangle[rows - 1][0]; for (int j = 0; j < triangle[rows - 1].size(); ++j) { if (minSum > triangle[rows - 1][j]) minSum = triangle[rows - 1][j]; }//for return minSum; } };

相關推薦

LeetCode120 Triangle

題目 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. F

leetcode120.MediumTriangle

解題思路: DP 時間複雜度:O(n1) n1是二維陣列的大小 空間複雜度:O(n2) n2是三角形的層數 提交程式碼: class Solution { public int minimumTotal(List<List<Integer>> tri

LeetCode10Regular Expression Matching

class print false 二維 mat spa ssi lar match 題目如下: Python代碼: # -*- coding:utf-8 -*- def ismatch(s,p): #先將dp[s+1][p+1]二維數組全置為False

LeetCode9Palindrome Number

tco return color 代碼 nbsp ima images pan code 題目如下: Python代碼: def isPalindrome(self, x): """ :type x: int :r

LeetCode12Integer to Roman

題目 img code num mage roman div iii lee 題目如下: Python代碼 def intToRoman(self, num): """ :type num: int :rtype: str

LeetCode17Letter Combinations of a Phone Number

app code com elf img bject dex logs nbsp 題目如下: Python代碼: class Solution(object): def letterCombinations(self, digits): """

算法,取反向整數,LeetCode7

code 方式 解法 解決問題 取反 余數 數學 編程 反轉 最近在別人的推薦下剛開始接觸LeetCode,一個非常不錯的在線編程刷題網站,java小白目前還在刷簡單的算法題,不過挺有意思的。昨天碰到一個反向整數算法題,想了好久沒寫出答案,在網上搜了答案,貼在這裏,我是覺得

leetcode:274H-Index(java)

package LeetCode_HashTable; /** * 題目: * Given an array of citations (each citation is a non-negative integer) of a researcher, * write

leetcode:24Swap Nodes In Pairs(java)

package LeetCode_LinkedList; /** * 題目: * Given a linked list, swap every two adjacent nodes and return its head. * Example: *

LeetCode 3 Longest Substring Without Repeating Characters

這道題的題意很簡單,其實就是求一個給定的字串中最長的一段沒有重複字元的子串。我剛開始是這樣想的,設定兩個下標,其中一個為找到不重複子串的開始位置,另外一個為不重複子串的終止位置,然後對字串從頭開始掃。 class Solution { public: int lengthOf

LeetCode4 整數反轉

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 注意:

LeetCode3 有效的括號

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。 有效字串需滿足: 左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。 示例 1: 輸入: “()” 輸出: true

LeetCode2最接近的三數之和

給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1.

LeetCode1三數之和為0

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -

用Swift刷LeetCode

1.兩數之和 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的 兩個 整數。 你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。 思路:雜湊表記錄遍歷過的數字和下標。 // 方法:暴力法 // 執行時間20ms c

LeetCode14—— 最長公共字首

描述 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例2

LeetCode14-- 最長公共字首

編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 ""。 輸入: ["flower","flow","flight"] 輸出: "fl" 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共字首。 cl

1.兩數之和-leetcodepython

題目描述 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 +

leetcode——1

由於C++不太會,故用python表示,人生苦短…題目、分析源於公眾號:LeetCode領釦 兩數之和: 題目描述:給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數的索引。可以假定每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定

LeetCode17—— 電話號碼的字母組合

題目描述 給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。 給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。 示例: 輸入:"23" 輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce