热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数组与矩阵---不重复打印排序数组中相加和为给定值的所有二元组和三元组

【题目】给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。例如,arr[-8,-4,-3,0,1,2,4,5,8,9],k10,打

【题目】

  给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 10,打印结果为:1,9 2,8

【补充题目】

  给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序三元组。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 10,打印结果为: -4, 5, 9  -3, 4, 9  -3, 5, 8  0, 1, 9  0, 2, 8  1, 4, 5

【基本思路】

  利用排序后数组的特点,可以设置两个指针left和right,left从左边开始移动,right从右边开始移动。初始时 left = 0,right = len(arr) - 1。之后比较 arr[left] + arr[right] 和 k ,情况如下:

  • 如果arr[left] + arr[right] == k,满足条件,将这个两个元素打印出来
  • 如果arr[left] + arr[right]
  • 如果arr[left] + arr[right] > k,说明需要加一个更小的数,令right减1

计算的过程中要判断打印的元组之前是否打印过,只需要每次打印的时候检查 arr[left] 是否等于 arr[left-1]。整个时间复杂度O(N)。

下面是使用python3.5实现的代码。

def printUniquePair(arr, k):
if arr == None or len(arr) <2:
return
left = 0
right = len(arr) - 1
while left <right:
sum = arr[left] + arr[right]
if sum == k:
if left == 0 or arr[left] != arr[left-1]:
print(str(arr[left]) + "," + str(arr[right]))
left += 1
right -= 1
elif sum > k:
right -= 1
else:
left += 1

  打印三元组的方法类似。只需要提前确定第一个元素(假设为a),剩下的两个元素只需要按照打印二元组的方法找累加和为 k - a 的二元组。为了不重复打印,在确定第一个元素的时候也要判断是否之前出现过。实现代码如下:

def printUniqueTriad(arr, k):
if arr == None or len(arr) <3:
return
for i in range(len(arr)):
if i == 0 or arr[i] != arr[i-1]:
left = i + 1
right = len(arr) - 1
while left <right:
sum = arr[left] + arr[right]
if sum == k - arr[i]:
if left == i+1 or arr[left] != arr[left-1]:
print(str(arr[i]) + "," + str(arr[left]) + "," + str(arr[right]))
left += 1
right -= 1
elif sum > k - arr[i]:
right -= 1
else:
left += 1

推荐阅读
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Java数组的定义、初始化和多维数组的用法。通过动态初始化和静态初始化两种方式来初始化数组,并讨论了数组的内存分配和下标的特点。同时详细介绍了Java二维数组的概念和使用方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
author-avatar
年轻的蒲山公_777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有