From ba5667b5df80b8b89e6242f271fc14da4b868f00 Mon Sep 17 00:00:00 2001 From: KongJHong Date: Mon, 5 Nov 2018 12:47:19 +0800 Subject: [PATCH 1/2] Add Solution 119[CPP] --- solution/119.Pascal's Triangle II/README.md | 48 +++++++++++++++++++ .../119.Pascal's Triangle II/Solution.cpp | 15 ++++++ 2 files changed, 63 insertions(+) create mode 100644 solution/119.Pascal's Triangle II/README.md create mode 100644 solution/119.Pascal's Triangle II/Solution.cpp diff --git a/solution/119.Pascal's Triangle II/README.md b/solution/119.Pascal's Triangle II/README.md new file mode 100644 index 0000000000000..96a14a3782971 --- /dev/null +++ b/solution/119.Pascal's Triangle II/README.md @@ -0,0 +1,48 @@ +## 杨辉三角 II + +### 问题描述 +给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 + +![杨辉三角](https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif) + +在杨辉三角中,每个数是它左上方和右上方的数的和。 + +``` +示例: + +输入: 3 +输出: [1,3,3,1] +``` +进阶: + +你可以优化你的算法到 O(k) 空间复杂度吗? + +---------- +### 思路 + +利用滚动数组的思想(和118题一样,省了行坐标): + +因为每一个列坐标都是上一个行同列和前列之和,所以,只需要一组数组就可以模拟出来,并不需要二维数组 + +`col[j] = col[j]+col[j-1];` + +**注意**:因为使用了`j-1`列和`j`列,为了防止重叠,不能从前往后跟新数组;只能从后往前 + +```CPP +class Solution { +public: + vector getRow(int rowIndex) { + vector ans; + + for(int i = 0;i <= rowIndex;i++){ + for(int j = i-1;j > 0;j--){ + ans[j] = ans[j-1] + ans[j]; + } + ans.push_back(1); + } + return ans; + + } +}; + +``` \ No newline at end of file diff --git a/solution/119.Pascal's Triangle II/Solution.cpp b/solution/119.Pascal's Triangle II/Solution.cpp new file mode 100644 index 0000000000000..55a99e5c799fe --- /dev/null +++ b/solution/119.Pascal's Triangle II/Solution.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + vector getRow(int rowIndex) { + vector ans; + + for(int i = 0;i <= rowIndex;i++){ + for(int j = i-1;j > 0;j--){ + ans[j] = ans[j-1] + ans[j]; + } + ans.push_back(1); + } + return ans; + + } +}; \ No newline at end of file From d6fa0dae1bed3e653401bea71658bbc66ee0480d Mon Sep 17 00:00:00 2001 From: KongJHong Date: Mon, 5 Nov 2018 22:35:02 +0800 Subject: [PATCH 2/2] Add Solution 120[CPP] --- solution/120.Triangle/README.md | 79 ++++++++++++++++++++++++++++++ solution/120.Triangle/Solution.cpp | 30 ++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 solution/120.Triangle/README.md create mode 100644 solution/120.Triangle/Solution.cpp diff --git a/solution/120.Triangle/README.md b/solution/120.Triangle/README.md new file mode 100644 index 0000000000000..dcb8ee3df36d8 --- /dev/null +++ b/solution/120.Triangle/README.md @@ -0,0 +1,79 @@ +## 三角形最小路径和 + +### 问题描述 + +给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 + +例如,给定三角形: +``` +[ + [2], + [3,4], + [6,5,7], + [4,1,8,3] +] +``` +自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。 + +说明: + +如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。 + +---------- +### 思想: + +方法和119题如出一辙,都是利用**滚动数组**的原理(既对数组按特定规则进行条件层层处理,如同滚动) + +方法是对每一个元素(除第一行)都构建最短路径 + +- 对于**左右边界**,最短路径只能是 + +``` +triangle[i][0] = triangle[i-1][0] +以及 +triangle[i][j] = triangle[i][j] + triangle[i-1][j-1] (j = i时成立) +``` + +- 对于**非左右边界**的其他任意值,其最短路径公式为 + +``` +triangle[i][j] = triangle[i][j] + min(triangle[i-1][j],triangle[i-1][j-1] +``` + +- 对重新整理好的数组,遍历最下面一行元素,找最小值 + +- O(1) 额外空间!!!! + +```CPP +class Solution { +public: + int minimumTotal(vector>& triangle) { + size_t rowNum = triangle.size(); + + //特殊值处理 + if(rowNum == 0)return 0; + if(rowNum == 1){ + if(triangle[0].empty())return 0; + else return triangle[0][0]; + } + + for(int i = 1;i=0;j--){ + //边界处理 + if(j == 0){triangle[i][j] = triangle[i][j] + triangle[i-1][j];continue;} + if(j == i){triangle[i][j] = triangle[i][j] + triangle[i-1][j-1];continue;} + + //一般处理 + triangle[i][j] = triangle[i][j] + min(triangle[i-1][j],triangle[i-1][j-1]); + } + } + + int ans = INT_MAX; + for(auto v : triangle[rowNum-1]){ + if(ans > v)ans = v; + } + return ans; + } +}; + +``` \ No newline at end of file diff --git a/solution/120.Triangle/Solution.cpp b/solution/120.Triangle/Solution.cpp new file mode 100644 index 0000000000000..c6e0867893a7e --- /dev/null +++ b/solution/120.Triangle/Solution.cpp @@ -0,0 +1,30 @@ +class Solution { +public: + int minimumTotal(vector>& triangle) { + size_t rowNum = triangle.size(); + + //特殊值处理 + if(rowNum == 0)return 0; + if(rowNum == 1){ + if(triangle[0].empty())return 0; + else return triangle[0][0]; + } + + for(int i = 1;i=0;j--){ + //边界处理 + if(j == 0){triangle[i][j] = triangle[i][j] + triangle[i-1][j];continue;} + if(j == i){triangle[i][j] = triangle[i][j] + triangle[i-1][j-1];continue;} + + //一般处理 + triangle[i][j] = triangle[i][j] + min(triangle[i-1][j],triangle[i-1][j-1]); + } + } + + int ans = INT_MAX; + for(auto v : triangle[rowNum-1]){ + if(ans > v)ans = v; + } + return ans; + } +}; \ No newline at end of file