LeetCode存在重复元素

LeetCode存在重复元素

题目:判断列表中是否存在相同元素
解法:4种
推荐:方法3
语言:python

题目介绍如下:
存在重复元素
题目通俗说明:

给定一个没有顺序的列表,如果列表中有相同元素就返回True,没有则返回False

解法如下:

# author:铁臂阿童木

# datetime:2022/1/26 10:52

# software: PyCharm

# 先定义两个条件列表
nums1 = [1,2,3,4,5,6]
nums2 = [2,1,3,4,4]

# 序号:方法一(最容易想到的方法)
# 方法:两次循环方法(脚踏两只船未遂法)
# 思想:i层循环先选定列表中一个元素,j层再去找此元素后面有没有和此元素相同的元素
# 优点:方法直接
# 缺点:耗时
def containsDuplicate(nums):
    i = 0
    j = 1
    n = len(nums)
    while (i < n-1):    # 因为j层循环要去找i层循环选中元素后面的元素,所以i层循环选定元素的下标只要到n-1即可
        while (i+j < n):
            if(nums[i+j] == nums[i]):   # nums[i]是i层循环选中的元素
                return True      # 如果找到相同元素直接返回True
            else:
                j += 1           # 没找到就继续进行j层循环与i层循环选中的元素进行比对
        i += 1        # j层循环中没找到与i层循环选定元素相等的值,i层循环选定下一位的元素
        j = 1         # 此处必须将j重置为1否则,无法进行第一层循环
    return False      # 如果最终没找到相同元素,即返回False

print(containsDuplicate(nums2))


# 序号:方法二
# 方法:排序比对方法
# 思想:先对列表进行排序得到有序的列表,再对列表中前后元素进行分别对比
# 优点:方法直接
# 缺点:比方法一省时间
def containsDuplicate2(nums):
    nums.sort()    # 先进行排序
    i = 1
    n = len(nums)
    while (i<n):
        if(nums[i] == nums[i-1]):   # 相邻位置进行比对
            return True             # 相等直接返回True
        i += 1                      # 不相等就继续循环,对下个元素与它的前一个元素进行比对
    return False                    # 如果最终没找到相同元素,即返回False

print(containsDuplicate2(nums2))


# 序号:方法三
# 方法:集合中元素唯一特性法
# 思想:利用集合中元素唯一的特性,将列表转换成集合,再对原列表和集合的长度进行对比
# 优点:省时间
# 缺点:一次将列表所有元素转换到集合中,如果列表中元素繁多,就浪费内存(方法四思想上对此方法做了优化)
def containsDuplicate3(nums):
    return (len(nums) != len(set(nums)))   # 判断转换成集合的列表长度是否与原列表一致

print(containsDuplicate3(nums2))


# 序号:方法四
# 方法:集合中元素唯一特性法
# 思想:利用集合中元素唯一的特性,将列表中元素逐个复制到集合,每一次都对复制之前和复制之后的集合长度进行比较
# 优点:比方法三省空间
# 缺点:每次循环都要测长度,效率低
def containsDuplicate4(nums):
    s = set()
    i = 0
    n = len(nums)
    nums.sort()              # 先对数组排序
    while i < n :
        o_s = len(s)
        s.add(nums[i])       # 将列表中元素复制到集合中,如果集合中已经有此元素,集合的长度不会改变
        n_s = len(s)
        if (o_s == n_s):     # 判断长度是否改变
            return True      # 如果不变则证明出现重复元素
        else:
            i += 1
    return False

print(containsDuplicate4(nums2))

经验:

如果自己编写中出现错误,就针对简单示例数据进行测试,使用编译器的调试工具打断点测试!

感谢阅读!!!
有错误请您指出!!!
欢迎补充!!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值