【每日一题】2007. 从双倍数组中还原原数组-2024.4.18

题目:

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

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

给你一个数组 changed ,如果 change双倍 数组,那么请你返回 original数组,否则请返回空数组。original 的元素可以以 任意 顺序返回。

示例 1:

复制代码
输入:changed = [1,3,4,2,6,8]
输出:[1,3,4]
解释:一个可能的 original 数组为 [1,3,4] :
- 将 1 乘以 2 ,得到 1 * 2 = 2 。
- 将 3 乘以 2 ,得到 3 * 2 = 6 。
- 将 4 乘以 2 ,得到 4 * 2 = 8 。
其他可能的原数组方案为 [4,3,1] 或者 [3,1,4] 。

示例 2:

复制代码
输入:changed = [6,3,0,1]
输出:[]
解释:changed 不是一个双倍数组。

示例 3:

复制代码
输入:changed = [1]
输出:[]
解释:changed 不是一个双倍数组。

提示:

  • 1 <= changed.length <= 105
  • 0 <= changed[i] <= 105

解答:

代码:

复制代码
class Solution {
    public int[] findOriginalArray(int[] changed) {
        Arrays.sort(changed);
        int[] ans=new int[changed.length/2];
        int ansIdx=0;
        Map<Integer,Integer> hm=new HashMap<>();
        for(int x:changed){
            if(!hm.containsKey(x)){//x不是双倍后的元素
                if(ansIdx==ans.length){
                    return new int[0];
                }
                ans[ansIdx++]=x;
                hm.merge(x*2,1,Integer::sum);//标记一个双倍元素
            }else{//x是双倍后的元素
                int c=hm.merge(x,-1,Integer::sum);//清除一个标记
                if(c==0){
                    hm.remove(x);
                }
            }
        }
        return ans;
    }
}

结果:

相关推荐
wyiyiyi6 分钟前
【数据结构+算法】非递归遍历二叉树的理解
大数据·数据结构·笔记·算法·leetcode·数据分析
烤麻辣烫10 分钟前
黑马程序员苍穹外卖(新手)DAY8
java·开发语言·学习·spring·intellij-idea
fashion 道格10 分钟前
从地图导航到数据结构:解锁带权有向图的邻接链表奥秘
c语言·数据结构·链表
就叫飞六吧10 分钟前
Java 中编译一个 java 源文件产生多个 .class 文件原因
java·开发语言
爱跑步的程序员~13 分钟前
Elasticsearch倒排索引
java·大数据·elasticsearch·搜索引擎·全文检索
2401_8933266214 分钟前
力扣1971.寻找图中是否存在路径
算法·leetcode·职场和发展
s***45314 分钟前
Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
java·spring boot·后端
专注API从业者17 分钟前
构建分布式京东商品数据采集器:基于微服务的架构设计与实现
数据结构·数据库·分布式·微服务·架构
zs宝来了23 分钟前
HOT100-技巧类型题
数据结构·算法
Ayanami_Reii23 分钟前
进阶数据结构-FenwickTree
数据结构·算法·树状数组·fenwick tree