螺丝与螺母匹配

问题描述:

给你2堆大小不同的螺丝螺母,螺丝与螺母是相互匹配的,但是螺丝与螺丝之间,螺母与螺母之间不能直接对比,仅仅螺丝与螺母进行对比,请设计一个分治算法实现。

示例:

输入:nuts = [5, 3, 7, 1, 6],bolts = [1, 7, 6, 3, 5] # nuts表示螺母,bolts表示螺丝或者螺栓
输出:nuts =[1, 3, 5, 6, 7], bolts = [1, 3, 5, 6, 7]

问题分析:

题目有一定难度,但是理解透彻了之后你会发现,其实并不难,这里利用分而治之(快速排序)的思想来解决。具体如何去做,使用递归就可以实现,现在咱们就走一边,第一步:
(1)从nuts中选一个元素,假设选取的是nuts[0],与 bolts 中的所有元素做比较,找出与其相等的元素bolts[mark] (最右边那个),同时统计比nuts[0]小的元素个数count

        for i in range(l, r + 1):t = self.cmp(a[l], b[i])    # a中的第一个值(元素)为基准,与b中所有值做比较,用来确定b中与a[0]相等的元素位置mark,和 b 中小于a[0]元素的个数 countif t == 0: mark = i         # a第一个元素和b相等元素, 最终会找到b中的最右边的匹配elif t == 1: count += 1     # a第一个元素大于b中的元素的个数

(2)根据统计的比nuts[0]小的元素个数count,就可以确定当前nuts[0]的最终位置,同时也就确定了bolts[mark] 的最终位置,进行归位操作,相当于快速排序中归位一个元素。

        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就是中轴

(3)其他的值都以这个基准为标杆,小于的放到左区间,大于的放到右区间,然后接着递归左右区间,即可完成排序。

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中的第一个值(元素)为基准,与b中所有值做比较,用来确定b中与a[0]相等的元素位置mark,和 b 中小于a[0]元素的个数 countif 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++代码,但是参考链接找不到了,抱歉。

算法题-螺丝与螺母匹配 - Python相关推荐

  1. 道指mt4代码_剑指offer算法题052:正则表达式匹配

    小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法.考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offe ...

  2. 蓝桥云算法题之棋盘放麦子——Python满分解答

    棋盘放麦子 题目描述 运行限制 解题思路 代码实现 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服,问他要什么 ...

  3. 算法题 - 卡牌游戏问题 - Python

    问题描述: 卡牌游戏问题   小a和小b玩一个游戏,有 n张卡牌,每张上面有两个正整数 x, y.取一张牌时,个人积分增加 x,团队积分增加 y.求小a,小b各取若干张牌,使得他们的 个人积分相等,且 ...

  4. 蓝桥云算法题之火柴棒等式——Python满分解答

    火柴棒等式 题目描述 图片描述 输入描述 输出描述 输入输出样例 示例 1 输入 输出 样例解释 示例 2 输入 输出 样例解释 解题思路 代码实现 题目描述 给你 n 根火柴棍,你可以拼出多少个形如 ...

  5. python一只青蛙一次可以_python算法题 python123网站单元四题目

    下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 3.博主解题的思路 这道题在c语言中是一道经典的题目,可以用循环,或者递归,在这里我们用python来写 ...

  6. python代码基础题-python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  7. python每日经典算法题5(基础题)+1(较难题)

    一:基础算法题5道 1.阿姆斯特朗数 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数.判断用户输入的数字是否为阿姆斯特朗数. (1)题目分析:这里要先得到该数是多少位的,然后再把 ...

  8. python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  9. 算法题Nuts and Bolts(螺母螺钉)快速排序详细讲解(含流程图)

    1. 思路 首先选择螺丝中的一个元素作为pivot,用螺丝把螺母分区,每次分区得到三个结果, A1,完全匹配的一对 A2,比螺丝小的螺母 A3,比螺丝大的螺母 将1中的螺母取出,用它对螺丝进行分区,可 ...

  10. LeetCode 221. Maximal Square----动态规划--谷歌面试算法题--Python解法

    题目地址:Maximal Square - LeetCode Given a 2D binary matrix filled with 0's and 1's, find the largest sq ...

最新文章

  1. 手动部署OpenStack环境(五:新建网络及部署虚拟机)
  2. 电信运营商的云机遇-【软件和信息服务】2015.01
  3. js 中对象--对象结构(原型链基础解析)
  4. MySQL ACID及四种隔离级别的解释
  5. Spring-IOC XML 配置多个相同 ID 的 bean 加载分析
  6. 45 FI配置-财务会计-固定资产-一般评估-指定折旧条件转移
  7. 7-1 顶点的度 (15 分)
  8. 从环境搭建到回归神经网络案例,带你掌握Keras
  9. mysql c接口返回自增id_详解mysql插入数据后返回自增ID的七种方法
  10. 解决coding上的hexo博客访问不了的问题
  11. iOS-深复制(mutableCopy)与浅复制(copy)
  12. 第二次结对编程作业——毕业导师智能匹配
  13. microsoft html help workshop_云话科技 | 奥比中光Workshop技术研讨线上沙龙
  14. PMP®|项目经理如何应对项目需求变更?
  15. 副业做淘宝可以么?淘宝可以当做副业来做吗?
  16. Unity编辑器修改图片的大小
  17. Android应用开发-小巫CSDN博客客户端总结篇
  18. 计算机资源管理器经常停止运行,windows资源管理器已停止工作一直弹出来彻底解决方案...
  19. 在x86下交叉编译mips程序
  20. GTK、GDK、GLIB三者的关系 - 阿堂的专栏 - 博客频道 - CSDN.NET

热门文章

  1. 浅谈Linux的哲学思想
  2. 计算机与信息工程学院创新创意的毕业设计题目推荐50例
  3. 干货操作:Shell脚本一键安装samba服务,任何人都可以访问,目录只读------------------------小董偷懒系列
  4. UE4 使用Nvidia Ansel工具采集全景图(必须进行支持的游戏,方可使用此功能)
  5. 了解AscendCL数据预处理的两种方式:AIPP和DVPP
  6. 字节跳动面试:昆明java招聘
  7. 【程序员的盛宴】GitHub 2019 年度报告有哪些值得关注的?
  8. python之AES加密解密踩坑记录
  9. 微波通信入门,新人必读!
  10. BASIC(來自英語:的縮寫)又譯培基,是一種直譯式程序设计语言。