# gyu_algorithm_songtao **Repository Path**: ousei/gyu_algorithm_songtao ## Basic Information - **Project Name**: gyu_algorithm_songtao - **Description**: 六题力扣中等难度各解法以做期末作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-06-15 - **Last Updated**: 2022-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gyu_algorithm_songtao #### 介绍 六题力扣中等难度各解法以做期末作业 class Solution: def tempControl(self, i, j, k, temp, final, remainCombine): # 处理已存储但剩余的组合可能核心 如输入print(vio(5, 3)) remain应为[[1, 4], [1, 5], [2, 5]] for item in final: if item[0] == i: remainCombine.append([i, j]) if k == 1: #处理单个情况直接存 temp.append(i) elif len(temp) == 0: #temp为空的话存两个 temp.append(i) temp.append(j) elif temp[0] == i: #temp不为空要确保传进来的新i和之前组合开头相同 temp.append(j) else: # 如果不同就删掉重开一个i开头的组合 temp.clear() temp.append(i) temp.append(j) #这里检查临时组合的长度是否已经和需要的相同,如果相同就存放并且清除 if len(temp) == k: final.append([i for i in temp]) temp.clear() def combine(self, n: int, k: int) -> List[List[int]]: temp = [] final = [] remainCombine = [] # 处理k值为1但range最后一位取不到的情况 if k == 1: n += 1 # 循环组合两两给temp_control处理 for i in range(1, n + 1): for j in range(i + 1, n + 1): Solution.tempControl(self, i, j, k, temp, final, remainCombine) if k == 1: break # 如果组合大于3 那么需要把剩余组合可能枚举每一个出来然后和finalList做对比,还能枚举出来就往里append if k >= 3: whileContril = k #需要枚举的循环次数,由组合长度控制 但因为需要用k来判断而while需要为0故拿出来避免影响 newRemainCombine = [] #每一轮循环会产生一个新的剩余数组 while whileContril-2: #控制需要几轮循环 for i in remainCombine: all = [i for i in range(1, n + 1)] #可能出现的数字列表 for j in i: #重复的删掉(每轮循环都会所以不会枚举出重复的) all.remove(j) for remainNumber in all: #开始枚举 t = [item for item in i] #临时数组(如果直接操作i的话会影响赋值) t.append(remainNumber) #添加枚举出来的非重复数 if len(t) <= k: #如果不大于k那么就存到新剩余数组里 newRemainCombine.append(t) remainCombine = [new for new in newRemainCombine] #每轮增加都把心剩余数组替换为全局剩余数组 # 如果不用枚举直接赋值的话会导致清空影响,列表存的是被赋值列表的地址就不合适了 newRemainCombine.clear() #清空 whileContril -= 1 #此处枚举完成开始比对半成品数组 sameControl = 1 for i in remainCombine: for f in final: #如果发现哪怕一次组合重复也不会执行添加 if sorted(f) == sorted(i): sameControl = 0 if sameControl: final.append(i) #重置进入下次循环 sameControl = 1 return final 提交力扣版本