Python每日一练(20230506) 存在重复元素I、II、III

简介: Python每日一练(20230506) 存在重复元素I、II、III

1. 存在重复元素 Contains Duplicate I


给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false


示例 1:


输入:nums = [1,2,3,1]

输出:true


示例 2:

输入:nums = [1,2,3,4]

输出:false


示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]

输出:true


提示:

   1 <= nums.length <= 10^5

   -10^9 <= nums[i] <= 10^9

代码: 多种方法实现

from typing import List
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        n = len(nums)
        for i in range(n):
            for j in range(i + 1, n):
                if nums[i] == nums[j]:
                    return True
        return False
    def containsDuplicate2(self, nums: List[int]) -> bool:
        num_set = set()
        for num in nums:
            if num in num_set:
                return True
            num_set.add(num)
        return False
    def containsDuplicate3(self, nums: List[int]) -> bool:
        nums.sort()
        for i in range(1, len(nums)):
            if nums[i] == nums[i - 1]:
                return True
        return False
    def containsDuplicate4(self, nums: List[int]) -> bool:
        return len(nums) != len(set(nums))
if __name__ == '__main__':
    s = Solution()
    nums = [1,2,3,1]
    print(s.containsDuplicate(nums))
    print(s.containsDuplicate2(nums))
    print(s.containsDuplicate3(nums))
    print(s.containsDuplicate4(nums))
    nums = [1,2,3,4]
    print(s.containsDuplicate(nums))
    print(s.containsDuplicate2(nums))
    print(s.containsDuplicate3(nums))
    print(s.containsDuplicate4(nums))
    nums = [1,1,1,3,3,4,3,2,4,2]
    print(s.containsDuplicate(nums))
    print(s.containsDuplicate2(nums))
    print(s.containsDuplicate3(nums))
    print(s.containsDuplicate4(nums))


输出:

True

True

True

True

False

False

False

False

True

True

True

True




2. 存在重复元素 Contains Duplicate II


给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。


示例 1:

输入:nums = [1,2,3,1], k = 3

输出:true


示例 2:

输入:nums = [1,0,1,1], k = 1

输出:true


示例 3:

输入:nums = [1,2,3,1,2,3], k = 2

输出:false


提示:

   1 <= nums.length <= 10^5

   -10^9 <= nums[i] <= 10^9

   0 <= k <= 10^5


代码: 多种方法实现

from typing import List
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        for i in range(n):
            for j in range(i + 1, min(i + k + 1, n)):
                if nums[i] == nums[j]:
                    return True
        return False
    def containsNearbyDuplicate2(self, nums: List[int], k: int) -> bool:
        num_index = {}
        for i in range(len(nums)):
            if nums[i] in num_index and i - num_index[nums[i]] <= k:
                return True
            num_index[nums[i]] = i
        return False
    def containsNearbyDuplicate3(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        if k >= n:
            k = n - 1
        num_set = set(nums[:k + 1])
        if len(num_set) != k + 1:
            return True
        for i in range(k + 1, n):
            num_set.remove(nums[i - k - 1])
            if nums[i] in num_set:
                return True
            num_set.add(nums[i])
        return False
if __name__ == '__main__':
    s = Solution()
    nums = [1,2,3,1]
    print(s.containsNearbyDuplicate(nums, 3))
    print(s.containsNearbyDuplicate2(nums, 3))
    print(s.containsNearbyDuplicate3(nums, 3))
    nums = [1,0,1,1]
    print(s.containsNearbyDuplicate(nums, 1))
    print(s.containsNearbyDuplicate2(nums, 1))
    print(s.containsNearbyDuplicate3(nums, 1))
    nums = [1,2,3,1,2,3]
    print(s.containsNearbyDuplicate(nums, 2))
    print(s.containsNearbyDuplicate2(nums, 2))
    print(s.containsNearbyDuplicate3(nums, 2))

输出:

True

True

True

True

True

True

False

False

False


3. 存在重复元素 Contains Duplicate III


给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。


示例 1:

输入:nums = [1,2,3,1], k = 3, t = 0

输出:true


示例 2:

输入:nums = [1,0,1,1], k = 1, t = 2

输出:true


示例 3:

输入:nums = [1,5,9,1,5,9], k = 2, t = 3

输出:false


提示:

   0 <= nums.length <= 2 * 10^4

   -2^31 <= nums[i] <= 2^31 - 1

   0 <= k <= 10^4

   0 <= t <= 2^31 - 1


代码: 多种方法实现

from typing import List
import bisect
class Solution:
    def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
        n = len(nums)
        for i in range(n):
            for j in range(i + 1, min(i + k + 1, n)):
                if abs(nums[i] - nums[j]) <= t and abs(i - j) <= k:
                    return True
        return False
    def containsNearbyAlmostDuplicate2(self, nums: List[int], k: int, t: int) -> bool:
        n = len(nums)
        if t < 0 or k <= 0:
            return False
        bst = []
        for i in range(n):
            idx = bisect.bisect_left(bst, nums[i] - t)
            if idx < len(bst) and abs(bst[idx] - nums[i]) <= t:
                return True
            bisect.insort(bst, nums[i])
            if i >= k:
                bst.remove(nums[i - k])
        return False
    def containsNearbyAlmostDuplicate3(self, nums: List[int], k: int, t: int) -> bool:
        if t < 0 or k <= 0:
            return False
        n = len(nums)
        dic = dict()
        w = t + 1
        for i in range(n):
            m = nums[i] // w
            if m in dic:
                return True
            elif m - 1 in dic and abs(nums[i] - dic[m - 1]) < w:
                return True
            elif m + 1 in dic and abs(nums[i] - dic[m + 1]) < w:
                return True
            dic[m] = nums[i]
            if i >= k:
                del dic[nums[i - k] // w]
        return False
if __name__ == '__main__':
    s = Solution()
    nums = [1,2,3,1]
    print(s.containsNearbyAlmostDuplicate(nums, 3, 0))
    print(s.containsNearbyAlmostDuplicate2(nums, 3, 0))
    print(s.containsNearbyAlmostDuplicate3(nums, 3, 0))
    nums = [1,0,1,1]
    print(s.containsNearbyAlmostDuplicate(nums, 1, 2))
    print(s.containsNearbyAlmostDuplicate2(nums, 1, 2))
    print(s.containsNearbyAlmostDuplicate3(nums, 1, 2))
    nums = [1,5,9,1,5,9]
    print(s.containsNearbyAlmostDuplicate(nums, 2, 3))
    print(s.containsNearbyAlmostDuplicate2(nums, 2, 3))
    print(s.containsNearbyAlmostDuplicate3(nums, 2, 3))

输出:

True

True

True

True

True

True

False

False

False


目录
相关文章
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
244 0
|
Python
Python 选出列表中特定的元素
Python 选出列表中特定的元素
233 3
|
数据处理 索引 Python
Python列表与元素修改的操作技巧
Python列表提供了丰富的方法和技巧来进行高效的数据操作。熟练运用上述技巧,可以大大提高数据处理的效率和代码的可读性。实践中,根据具体需求灵活选择合适的方法,可以在保证代码效率的同时,也使代码更加简洁明了。
357 2
|
程序员 Python
Python 将元素添加到列表
【8月更文挑战第21天】
528 3
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
133 2
|
索引 Python
Python中,元素
【7月更文挑战第13天】Python中,元素
160 5
|
Python
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
269 0
|
安全 Python 容器
Python中解包元素数量匹配
【6月更文挑战第21天】
170 2
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
172 0
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
124 0

推荐镜像

更多