问题描述:
给你2
堆大小不同的螺丝
与螺母
,螺丝与螺母是相互匹配
的,但是螺丝与螺丝之间,螺母与螺母之间不能直接对比
,仅仅螺丝与螺母
进行对比,请设计一个分治算法实现。
示例:
输入:nuts = [5, 3, 7, 1, 6],bolts = [1, 7, 6, 3, 5]
输出:nuts =[1, 3, 5, 6, 7], bolts = [1, 3, 5, 6, 7]
问题分析:
题目有一定难度,分治(快速排序)思想,稍后更新。
Python3实现:
# @Time :2023/08/15
# @Author :Liu
# 分治思想class Solution:def cmp(self, a, b): # 比较大小if a > b: return 1if a == b: return 0if a < b: return -1def quickSort(self, a, b, l, r):mark, count = 0, 0for i in range(l, r + 1):t = self.cmp(a[l], b[i]) # a's first compare with all b'sif t == 0: mark = i # a第一个元素和b相等元素, 最终会找到b中的最右边的匹配elif t == 1: count += 1 # a第一个元素大于b中的元素的个数a[l], a[l + count] = a[l + count], a[l] # a 的左半部分分配count个元素b[mark], b[l + count] = b[l + count], b[mark] # b 的左半部分分出来count个元素mark = l + count # mark 就是相同的匹配了, mark就是中轴i, j = l, rwhile i < mark < j: # a 分成两部分while i < mark and self.cmp(a[i], b[mark]) == -1: # 小于的i += 1while j > mark and self.cmp(a[j], b[mark]) == 1: # 大于的j -= 1if i < j: # swapa[i], a[j] = a[j], a[i]i, j = l, rwhile i < mark < j: # b 分成两部分while i < mark and self.cmp(a[mark], b[i]) == 1:i += 1while j > mark and self.cmp(a[mark], b[j]) == -1:j -= 1if i < j: # swapb[i], b[j] = b[j], b[i]if l < mark: self.quickSort(a, b, l, mark - 1)if r > mark: self.quickSort(a, b, mark + 1, r)if __name__ == '__main__':# 测试用例nuts = [5, 3, 7, 1, 6]bolts = [1, 7, 6, 3, 5]sol = Solution()sol.quickSort(nuts, bolts, 0, len(nuts) - 1)print(nuts) # 输出 [1, 3, 5, 6, 7]print(bolts) # 输出 [1, 3, 5, 6, 7]
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。
参考了一个C++代码,但是参考链接找不到了,抱歉。