初学python记录:力扣2007. 从双倍数组中还原原数组

题目:

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

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

提示:

  • 1 <= changed.length <= 10^5
  • 0 <= changed[i] <= 10^5

思考:

数组original中每个元素乘以2加入数组中,得到数组changed ---->

  1. 数组changed一定有偶数个元素

  2. 数组changed的元素从小到大遍历,设当前元素为x,那么 x*2 一定另外存在于数组changed中,每次判断完后将当前这两个元素从changed中删去,继续向下判断。

代码如下:

python 复制代码
class Solution(object):
    def findOriginalArray(self, changed):
        """
        :type changed: List[int]
        :rtype: List[int]
        """
        original = []
        n = len(changed)
        i = 0
        if n % 2 == 1:
            return[]

        changed.sort()
        while i < n:
            x = changed[i]
            original.append(x)
            changed.remove(x)
            i -= 1
            n -= 1
            if x * 2 not in changed:
                return []
            else:
                changed.remove(x * 2)
                n -= 1
            i += 1
        return original

提交后卡在例子 176 / 179 超时了:

可以看到这一句判断语句每判断一次都要遍历一次数组,大大增加了耗时:

python 复制代码
if x * 2 not in changed:
                return []

那么直接在最开始统计changed中每个元素的出现次数即可,代码如下:

python 复制代码
from collections import Counter

class Solution(object):
    def findOriginalArray(self, changed):
        """
        :type changed: List[int]
        :rtype: List[int]
        """
        original = []
        n = len(changed)
        i = 0
        if n % 2 == 1:
            return[]

        changed.sort()
        count = Counter(changed)
        for x in changed:
            if count[x] >= 1:
                y = x * 2
                original.append(x)
                count[x] -= 1
                if count[y] < 1:
                    return []
                else:
                    count[y] -= 1
        return original

提交通过:

相关推荐
游是水里的游16 分钟前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_17 分钟前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
晚夜微雨问海棠呀18 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
cdut_suye28 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
南城花随雪。36 分钟前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
一道微光1 小时前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
四口鲸鱼爱吃盐2 小时前
Pytorch | 利用AI-FGTM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python