Skip to content

Commit 6c859a8

Browse files
committed
update
1 parent 9231686 commit 6c859a8

5 files changed

+131
-0
lines changed

61. 乘积最大子数组.md

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
***给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。***
2+
3+
```
4+
输入: nums = [2,3,-2,4]
5+
输出: 6
6+
解释: 子数组 [2,3] 有最大乘积 6。
7+
```
8+
9+
```
10+
class Solution(object):
11+
def maxProduct(self, nums):
12+
"""
13+
:type nums: List[int]
14+
:rtype: int
15+
"""
16+
#由于存在负数,那么会导致最大的变最小的,最小的变最大的,因此需要维护 dp_max[i] 即以位置 i 结尾的当前最大乘积, dp_min[i] 以位置 i 结尾的当前最小乘积。
17+
n = len(nums)
18+
dp_max = [0]*n
19+
dp_min = [0]*n
20+
dp_max[0] = nums[0]
21+
dp_min[0] = nums[0]
22+
res = max(dp_max[0], dp_min[0])
23+
for i in range(1,n):
24+
dp_max[i] = max(nums[i], dp_max[i-1]*nums[i], dp_min[i-1]*nums[i])
25+
dp_min[i] = min(nums[i], dp_min[i-1]*nums[i], dp_max[i-1]*nums[i])
26+
res = max(res, dp_max[i], dp_min[i])
27+
return res
28+
```

62. 最长递增子序列.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
***给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。***
2+
3+
```
4+
输入:nums = [10,9,2,5,3,7,101,18]
5+
输出:4
6+
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
7+
```
8+
9+
```
10+
class Solution:
11+
def lengthOfLIS(self, nums: List[int]) -> int:
12+
#dp[i]表示以nums[i]结尾的上升子序列的长度,nums[i]必须被选取,且必须为这个子序列的最后一个元素。
13+
n = len(nums)
14+
dp = [1]*n
15+
for i in range(1, n):
16+
for j in range(i):
17+
if nums[j] < nums[i]:
18+
dp[i] = max(dp[j]+1, dp[i])
19+
return max(dp)
20+
```

63. 单词拆分.md

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
***给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。***
2+
3+
```
4+
输入: s = "leetcode", wordDict = ["leet", "code"]
5+
输出: true
6+
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
7+
```
8+
9+
```
10+
class Solution:
11+
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
12+
#dp[i]表示s[:i+1]是否可以用wordDict中的单词表示
13+
s = ' '+s
14+
n = len(s)
15+
dp = [False] *(n)
16+
dp[0] = True
17+
for i in range(1, n):
18+
for j in range(i+1, n+1):
19+
if dp[i-1] and s[i:j] in wordDict:
20+
dp[j-1] = True
21+
if dp[-1] == True:
22+
return True
23+
return False
24+
```

64. 目标和.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
***给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。***
2+
3+
```
4+
原问题等同于: 找到nums一个正子集和一个负子集,使得总和等于target
5+
我们假设P是正子集,N是负子集 例如: 假设nums = [1, 2, 3, 4, 5],target = 3,一个可能的解决方案是+1-2+3-4+5 = 3 这里正子集P = [1, 3, 5]和负子集N = [2, 4]
6+
那么让我们看看如何将其转换为子集求和问题:
7+
sum(P) - sum(N) = target
8+
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)
9+
2 * sum(P) = target + sum(nums)
10+
因此,原来的问题已转化为一个求子集的和问题: 找到nums的一个子集 P,使得sum(P) = (target + sum(nums)) / 2
11+
请注意,上面的公式已经证明target + sum(nums)必须是偶数,否则输出为0
12+
13+
dp[ i ][ j ]定义为从数组nums中 0 - i 的元素进行取舍可以得到 j 的方法数量
14+
```
15+
16+
```
17+
class Solution(object):
18+
def findTargetSumWays(self, nums, target):
19+
"""
20+
:type nums: List[int]
21+
:type target: int
22+
:rtype: int
23+
"""
24+
sumAll = sum(nums)
25+
if target > sumAll or (target + sumAll) % 2:
26+
return 0
27+
target = (target + sumAll) // 2
28+
29+
dp = [[0]*(target+1) for _ in range(len(nums))]
30+
dp[0][0] = 2 if nums[0] == 0 else 1
31+
32+
for j in range(1, target+1):
33+
if j==nums[0]:
34+
dp[0][j] = 1
35+
36+
37+
for i in range(1, len(nums)):
38+
for j in range(target+1):
39+
if j-nums[i] >= 0:
40+
dp[i][j] = dp[i-1][j]+dp[i-1][j-nums[i]]
41+
else:
42+
dp[i][j] = dp[i-1][j]
43+
return dp[-1][-1]
44+
```

65. 完全平方数.md

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
***给你一个整数 n ,返回和为 n 的完全平方数的最少数量。***
2+
3+
```
4+
class Solution:
5+
def numSquares(self, n: int) -> int:
6+
#dp[i]代表和为 i 的完全平方数的最少数量
7+
dp = [0]*(n+1)
8+
for i in range(1, n+1):
9+
dp[i] = i
10+
j = 1
11+
while i-j*j >= 0:
12+
dp[i] = min(dp[i], dp[i-j*j]+1)
13+
j += 1
14+
return dp[n]
15+
```

0 commit comments

Comments
 (0)