1. 问题描述:

Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成。她会选择一个任意的正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 higher :

  • 对每个满足 0 <= i < n 的下标 i ,lower[i] = arr[i] - k
  • 对每个满足 0 <= i < n 的下标 i ,higher[i] = arr[i] + k

不幸地是,Alice 丢失了全部三个数组。但是,她记住了在数组 lower 和 higher 中出现的整数,但不知道每个整数属于哪个数组。请你帮助 Alice 还原原数组。给你一个由 2n 个整数组成的整数数组 nums ,其中恰好 n 个整数出现在 lower ,剩下的出现在 higher ,还原并返回原数组 arr 。如果出现答案不唯一的情况,返回任一有效数组。注意:生成的测试用例保证存在 至少一个有效数组 arr 。

示例 1:

输入:nums = [2,10,6,4,8,12]
输出:[3,7,11]
解释:
如果 arr = [3,7,11] 且 k = 1 ,那么 lower = [2,6,10] 且 higher = [4,8,12] 。
组合 lower 和 higher 得到 [2,6,10,4,8,12] ,这是 nums 的一个排列。
另一个有效的数组是 arr = [5,7,9] 且 k = 3 。在这种情况下,lower = [2,4,6] 且 higher = [8,10,12] 。

示例 2:

输入:nums = [1,1,3,3]
输出:[2,2]
解释:
如果 arr = [2,2] 且 k = 1 ,那么 lower = [1,1] 且 higher = [3,3] 。
组合 lower 和 higher 得到 [1,1,3,3] ,这是 nums 的一个排列。
注意,数组不能是 [1,3] ,因为在这种情况下,获得 [1,1,3,3] 唯一可行的方案是 k = 0 。
这种方案是无效的,k 必须是一个正整数。

示例 3:

输入:nums = [5,435]
输出:[220]
解释:
唯一可行的组合是 arr = [220] 且 k = 215 。在这种情况下,lower = [5] 且 higher = [435] 。
 
提示:

2 * n == nums.length
1 <= n <= 1000
1 <= nums[i] <= 10 ^ 9
生成的测试用例保证存在至少一个有效数组 arr

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-the-original-array/

2. 思路分析:

为了方便处理数组中的元素可以先排序,分析题目可以知道nums[0] + k肯定属于lower中的元素,而且low与higher中的元素是一一对应的,所以我们可以从下标为1的位置开始枚举与之匹配的元素higher[i],并且与low[0]匹配的higher[i]的奇偶性肯定是一样的,此时的k = (higher[i] - low[0]) // 2才是一个整数,当我们找到当前与nums[0]匹配的元素之后,可以使用一个循环找到下一组匹配的low[l]与higher[r],因为数组是从小到大进行排序的所以可以使用双指针来寻找(满足单调性),并且在找到对应的匹配之后将nums[l] + k加入到答案中,如果循环结束那么答案的长度为n // 2说明当前的已经找到了符合要求的答案,返回对应的答案即可,如果没有找到那么枚举下一个与nums[0]匹配的元素知道找到答案就结束了。

3. 代码如下:

from typing import Listclass Solution:def recoverArray(self, nums: List[int]) -> List[int]:n = len(nums)# 从小到大排序nums.sort()for i in range(1, n):# nums[i]与nums[0]的奇偶性相同, 枚举当前的nums[i]作为nums[0]匹配的元素if nums[i] == nums[0] or (nums[i] - nums[0]) % 2 == 1: continueused = [0] * n# 标记已经被使用了, 找到了当前与0匹配的另外一个数字used[0] = used[i] = 1k = (nums[i] - nums[0]) // 2# res是原数组res = [nums[0] + k]# 双指针l, r = 0, ifor j in range(1, n // 2):while used[l] == 1: l += 1# 寻找与左边l匹配的位置rwhile r < n and (used[r] == 1 or nums[r] - nums[l] != 2 * k): r += 1if r >= n: breakres.append(nums[l] + k)# 标记已经被使用了used[l] = used[r] = 1if len(res) == n // 2: return resreturn None

2122 还原原数组(枚举,双指针)相关推荐

  1. LeetCode 2007. 从双倍数组中还原原数组(map)

    文章目录 1. 题目 2. 解题 1. 题目 一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所 ...

  2. 从双倍数组中还原原数组

    一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 . 给你一个数组 chang ...

  3. leetcode-从双倍数组中还原原数组

    一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 . 给你一个数组 chang ...

  4. leetcode 2007. 从双倍数组中还原原数组(C++、java、python)

    一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 . 给你一个数组 chang ...

  5. 4. Leetcode 18. 四数之和 (数组-双向双指针)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] ( ...

  6. LeetCode 1755. 最接近目标值的子序列和(状态枚举 + 双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个目标值 goal . 你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal . 也就是说,如果子序列元 ...

  7. 合并两个有序数组(双指针解题)

    1.题目:牛客网 NC22 (合并两个有序的数组) 描述 给出一个整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组 注意: 1.可以假设A数组有足够的空间存放B数组的元素 ...

  8. 数组-合并两个有序数组(双指针,从后往前)

    题意: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...

  9. 7. Leetcode 611. 有效三角形的个数 (数组-双向双指针)

    给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数.示例 1:输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 ( ...

最新文章

  1. 华为昇腾师资培训沙龙·南京场 |华为昇腾 ACL 语言开发实践全程干货来了!看完就实操系列...
  2. J2EE常用资源管理方式总结
  3. node.js基础 1之 HTTP事件回调进阶(HTTP模块)
  4. Nginx反向代理的系统优化
  5. java程序_Java程序员必备----Java命令大全
  6. extmail垃圾邮件存放垃圾邮件箱
  7. .NET 6 中的 Logging Source Generator
  8. 嵌入式linux写文件内存增加,嵌入式Linux对内存的直接读写
  9. java对接支付宝微信银联_JavaWEB后端支付银联,支付宝,微信对接
  10. iOS 11 将于9月19日正式发布,一文带你了解它的那些特性
  11. 金融评分卡项目—3.流失预警模型中的数据预处理与特征衍生
  12. C语言中指针的数据类型小结
  13. 2020中青杯本科题目学习
  14. 12抽象工厂(Abstract Factory)
  15. 雷霆战机服务器维护公告,雷霆战机停服公告 4月11日服务器维护
  16. 开机找不到硬盘的原因
  17. textarea层级问题
  18. 思科、华为交换机链路聚合(LACP)配置实例
  19. selenium - web 自动化测试
  20. 综述:目标检测2001-2021

热门文章

  1. 2021 牛津大学:Recent Advances in Reinforcement Learning in Finance
  2. python脚本--批量下载GNSS数据
  3. 视频分享 500 G JAVA视频网盘分享(JEECG开源社区)
  4. 经过离散点画平滑曲线(贝塞尔3次)
  5. UBI文件系统(转)
  6. DTI-ATS入门(2):DTI协议纵览
  7. 关于 range.autofilter 和 VBA的 filter
  8. vmware虚拟机安装windows server 2012 绕过秘钥安装——P2
  9. 网线8芯线各自作用是什么?几种常用的网线定义行业标准
  10. RWEQ模型土壤风蚀模数估算及其变化归因分析实践技术