Merge branch 'master' of github.com:youngyangyang04/leetcode-master

This commit is contained in:
youngyangyang04
2021-08-31 10:47:33 +08:00
5 changed files with 143 additions and 33 deletions

View File

@ -191,33 +191,48 @@ class Solution {
python: python:
```python ```python3
class Solution: class Solution:
def generateMatrix(self, n: int) -> List[List[int]]: def generateMatrix(self, n: int) -> List[List[int]]:
left, right, up, down = 0, n-1, 0, n-1 # 初始化要填充的正方形
matrix = [ [0]*n for _ in range(n)] matrix = [[0] * n for _ in range(n)]
num = 1
while left<=right and up<=down: left, right, up, down = 0, n - 1, 0, n - 1
# 填充左到右 number = 1 # 填充的数字
for i in range(left, right+1):
matrix[up][i] = num while left < right and up < down:
num += 1
up += 1 # 从左到右填充上边
# 填充上到下 for x in range(left, right):
for i in range(up, down+1): matrix[up][x] = number
matrix[i][right] = num number += 1
num += 1
right -= 1 # 从上到下填充右边
# 填充右到左 for y in range(up, down):
for i in range(right, left-1, -1): matrix[y][right] = number
matrix[down][i] = num number += 1
num += 1
down -= 1 # 从右到左填充下边
# 填充下到上 for x in range(right, left, -1):
for i in range(down, up-1, -1): matrix[down][x] = number
matrix[i][left] = num number += 1
num += 1
# 从下到上填充左边
for y in range(down, up, -1):
matrix[y][left] = number
number += 1
# 缩小要填充的范围
left += 1 left += 1
right -= 1
up += 1
down -= 1
# 如果阶数为奇数,额外填充一次中心
if n % 2:
matrix[n // 2][n // 2] = number
return matrix return matrix
``` ```

View File

@ -29,7 +29,7 @@
与198.打家劫舍213.打家劫舍II一样关键是要讨论当前节点抢还是不抢。 与198.打家劫舍213.打家劫舍II一样关键是要讨论当前节点抢还是不抢。
如果抢了当前节点,两个孩子就不动,如果没抢当前节点,就可以考虑抢左右孩子(**注意这里说的是“考虑”** 如果抢了当前节点,两个孩子就不动,如果没抢当前节点,就可以考虑抢左右孩子(**注意这里说的是“考虑”**
### 暴力递归 ### 暴力递归
@ -91,7 +91,7 @@ public:
### 动态规划 ### 动态规划
在上面两种方法,其实对一个节点 与不得到的最大金钱都没有做记录,而是需要实时计算。 在上面两种方法,其实对一个节点 与不得到的最大金钱都没有做记录,而是需要实时计算。
而动态规划其实就是使用状态转移容器来记录状态的变化这里可以使用一个长度为2的数组记录当前节点偷与不偷所得到的的最大金钱。 而动态规划其实就是使用状态转移容器来记录状态的变化这里可以使用一个长度为2的数组记录当前节点偷与不偷所得到的的最大金钱。
@ -121,7 +121,7 @@ vector<int> robTree(TreeNode* cur) {
2. 确定终止条件 2. 确定终止条件
在遍历的过程中,如果遇到空点的话很明显无论偷还是不偷都是0所以就返回 在遍历的过程中,如果遇到空点的话很明显无论偷还是不偷都是0所以就返回
``` ```
if (cur == NULL) return vector<int>{0, 0}; if (cur == NULL) return vector<int>{0, 0};
``` ```

View File

@ -9,6 +9,10 @@
# 673.最长递增子序列的个数 # 673.最长递增子序列的个数
[力扣题目链接](https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/)
给定一个未排序的整数数组,找到最长递增子序列的个数。 给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 1: 示例 1:
@ -224,16 +228,110 @@ public:
## Java ## Java
```java ```java
class Solution {
public int findNumberOfLIS(int[] nums) {
if (nums.length <= 1) return nums.length;
int[] dp = new int[nums.length];
for(int i = 0; i < dp.length; i++) dp[i] = 1;
int[] count = new int[nums.length];
for(int i = 0; i < count.length; i++) count[i] = 1;
int maxCount = 0;
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
if (dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
count[i] = count[j];
} else if (dp[j] + 1 == dp[i]) {
count[i] += count[j];
}
}
if (dp[i] > maxCount) maxCount = dp[i];
}
}
int result = 0;
for (int i = 0; i < nums.length; i++) {
if (maxCount == dp[i]) result += count[i];
}
return result;
}
}
``` ```
## Python ## Python
```python ```python
class Solution:
def findNumberOfLIS(self, nums: List[int]) -> int:
size = len(nums)
if size<= 1: return size
dp = [1 for i in range(size)]
count = [1 for i in range(size)]
maxCount = 0
for i in range(1, size):
for j in range(i):
if nums[i] > nums[j]:
if dp[j] + 1 > dp[i] :
dp[i] = dp[j] + 1
count[i] = count[j]
elif dp[j] + 1 == dp[i] :
count[i] += count[j]
if dp[i] > maxCount:
maxCount = dp[i];
result = 0
for i in range(size):
if maxCount == dp[i]:
result += count[i]
return result;
``` ```
## Go ## Go
```go ```go
func findNumberOfLIS(nums []int) int {
size := len(nums)
if size <= 1 {
return size
}
dp := make([]int, size);
for i, _ := range dp {
dp[i] = 1
}
count := make([]int, size);
for i, _ := range count {
count[i] = 1
}
maxCount := 0
for i := 1; i < size; i++ {
for j := 0; j < i; j++ {
if nums[i] > nums[j] {
if dp[j] + 1 > dp[i] {
dp[i] = dp[j] + 1
count[i] = count[j]
} else if dp[j] + 1 == dp[i] {
count[i] += count[j]
}
}
if dp[i] > maxCount {
maxCount = dp[i]
}
}
}
result := 0
for i := 0; i < size; i++ {
if maxCount == dp[i] {
result += count[i]
}
}
return result
}
``` ```
## JavaScript ## JavaScript

View File

@ -117,11 +117,8 @@ class Solution {
} }
// 如果K还大于0那么反复转变数值最小的元素将K用完 // 如果K还大于0那么反复转变数值最小的元素将K用完
if (k % 2 == 1) nums[len - 1] = -nums[len - 1]; if (k % 2 == 1) nums[len - 1] = -nums[len - 1];
int result = 0;
for (int a : nums) { return Arrays.stream(nums).sum();
result += a;
}
return result;
} }
} }
``` ```

View File

@ -80,7 +80,7 @@ dp状态图如下
* [动态规划关于01背包问题你该了解这些](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划关于01背包问题你该了解这些](https://programmercarl.com/背包理论基础01背包-1.html)
* [动态规划关于01背包问题你该了解这些滚动数组](https://programmercarl.com/背包理论基础01背包-2.html) * [动态规划关于01背包问题你该了解这些滚动数组](https://programmercarl.com/背包理论基础01背包-2.html)
就知道了01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了dp数组的两个for循环先后循序一定是先遍历物品再遍历背包容量。 就知道了01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了dp数组的两个for循环先后循序一定是先遍历物品再遍历背包容量。
**在完全背包中对于一维dp数组来说其实两个for循环嵌套顺序同样无所谓** **在完全背包中对于一维dp数组来说其实两个for循环嵌套顺序同样无所谓**