解法:索引
很常规的一道所引题,根据题目要求去模拟结果即可。
class Solution:
def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]:
if len(original) != m*n:
return []
result = []
for i in range(m):
result.append(original[i*n:(i+1)*n])
return result
491. 递增子序列
解法:DFS
通过DFS遍历得到所有的递增子序列,并对其进行过滤和去重,保留长度大于等于2的子序列,得到结果。
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
result = []
def dfs(cur, temp):
if len(temp) >= 2 and temp not in result:
result.append(temp)
if cur >= len(nums):
return
if len(temp)==0 or nums[cur] >= temp[-1]:
dfs(cur+1, temp+[nums[cur]])
dfs(cur+1, temp)
else:
dfs(cur+1, temp)
dfs(0, [])
return result
但该方法还有优化的空间,存在许多重复的情况,例如对于[4,6,7,7]遍历了第一个[4,6,7]情况后就无需在考虑第二个[4,6,7]的情况,故考虑进行剪枝来解决该问题。具体原理可参考官方解答
另外有关递归的编程技巧可参考递归编程技巧
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
result = []
def dfs(cur, temp):
# print(cur, temp)
if cur == len(nums):
if len(temp) >= 2:
result.append(temp)
return
if len(temp)==0 or nums[cur] >= temp[-1]:
dfs(cur+1, temp+[nums[cur]])
# dfs(cur+1, temp)
if len(temp)==0 or nums[cur] != temp[-1]:
dfs(cur+1, temp)
dfs(0, [])
return result



