Leetcode--287. 寻找重复数
发布日期:2021-04-30 21:01:25 浏览次数:116 分类:精选文章

本文共 877 字,大约阅读时间需要 2 分钟。

要解决这个问题,我们需要找到一个数组中唯一重复的整数。数组中包含n+1个整数,这些整数都在1到n之间。根据鸽巢原理,至少有一个数重复出现。我们需要一个高效的方法来找出这个重复的数。

方法思路

我们可以使用位操作来解决这个问题。具体来说,我们可以使用一个整数来记录已经遇到过的数。每次遍历数组中的一个数时,我们将这个数对应的位设置为1。如果再次遇到这个数时,说明它已经出现过,因此它就是重复的数。

这种方法的时间复杂度是O(n),空间复杂度是O(1),因为我们只需要一个整数来记录已遇到的数。

解决代码

public class Solution287 {    public static int findDuplicate(int[] nums) {        int mask = 0;        for (int num : nums) {            if ((mask & (1 << (num - 1))) != 0) {                return num;            }            mask |= (1 << (num - 1));        }        return -1; // 根据题意,这里不会有这个情况    }    public static void main(String[] args) {        int[] nums = {3, 1, 3, 4, 2};        System.out.println(findDuplicate(nums));    }}

代码解释

  • 初始化mask:我们使用一个整数mask来记录已经遇到过的数。
  • 遍历数组:对于数组中的每个数num,我们检查mask的第num-1位是否为1。如果是,说明num已经被遇到过,因此返回num。
  • 设置位:如果num还没有被遇到过,我们将mask的第num-1位设置为1,继续下一个数。
  • 这种方法高效且符合题目要求,能够在O(n)时间复杂度和O(1)空间复杂度下解决问题。

    上一篇:Spring --getBean用法
    下一篇:java网络编程基础认识(实现通信)

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2026年05月26日 21时34分21秒