力扣(LeetCode)217. 存在重复元素

存在重复元素

题目

给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

题解

01

思路:

使用集合set去除重复后再使用len,与不去重的不相等则返回True。

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len((set(nums))) != len(nums)

02

思路:

sort() 排序之后,相等元素相邻再比较。

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        nums.sort()
        for i in range(len(nums)-1):
            if nums[i+1] == nums[i]:
                return True
        return False
        



参考地址:pandawakaka

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个经典的三数之和问题。可以使用双指针的方法来解决。 具体的步骤如下: 1. 首先对数组进行排序,以便后续操作。 2. 遍历数组,对当前元素nums[i],使用双指针方法在剩余部分找到和为0的两个数。 - 定义两个指针,left指向i+1,right指向数组末尾。 - 在left < right的条件下,不断移动指针,判断nums[i] + nums[left] + nums[right]与0的关系。 - 如果等于0,将三个数加入结果集,并将left和right都向内移动一位。 - 如果小于0,说明和太小了,需要增大,将left向右移动一位。 - 如果大于0,说明和太大了,需要减小,将right向左移动一位。 - 注意要避免重复的情况,即如果移动指针后的数与移动前相等,则继续移动指针。 3. 返回结果集。 下面是相应的C++代码实现: ```cpp #include <vector> #include <algorithm> std::vector<std::vector<int>> threeSum(std::vector<int>& nums) { std::vector<std::vector<int>> result; int n = nums.size(); if (n < 3) { return result; } std::sort(nums.begin(), nums.end()); // 对数组进行排序 for (int i = 0; i < n - 2; i++) { if (nums[i] > 0) { break; // 当前元素大于0,无法满足和为0,直接退出循环 } if (i > 0 && nums[i] == nums[i - 1]) { continue; // 避免重复的情况 } int left = i + 1; int right = n - 1; while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (sum == 0) { result.push_back({nums[i], nums[left], nums[right]}); // 避免重复的情况 while (left < right && nums[left] == nums[left + 1]) { left++; } while (left < right && nums[right] == nums[right - 1]) { right--; } left++; right--; } else if (sum < 0) { left++; } else { right--; } } } return result; } ``` 这样,调用`threeSum`函数,并传入一个整数数组`nums`,即可得到所有和为0且不重复的三元组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值