剑指offer 3. 数组中重复的数字

  1. 空间复杂度O(n),时间复杂度O(n) 思路:通过定义长度N的数组,空间复杂度高一点,但易理解
public class Solution {

    public boolean duplicate(int numbers[],int length,int [] duplication) {
        // 1. 长度为0,不重复
        if(length == 0){
            return false;
        }
        // 2. 创建长度为N的数组往里设置值(规则下标与值相同,当第二次设置时便为重复值)
        Integer[] temp = new Integer[length];    
        for(int i = 0; i< length; i++){
           if(temp[numbers[i]] == null) {
              temp[numbers[i]] = numbers[i];
               continue;
           }
          duplication[0] = numbers[i];
          return true;
        }
        // 3. 设置完成未找到重复值,不重复
        return false;
    }
}
  1. 空间复杂度O(1),时间复杂度O(n)

思路:原数组交换,易出问题 badCase: [6,3,2,0,2,5,0] 输出:true 0 但是2是第一个重复的数字,此方式优先将0输出

public class Solution {
  
    public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(length == 0){
            return false;
        }
        for(int i = 0; i< length; i++){
            int temp = 0;
            while(numbers[i] != i){
                // 将numbers[i]放入相应的位置,
                // 若当前位置已经存在该元素则重复
                if(numbers[numbers[i]] == numbers[i]){
                    duplication[0] = numbers[i];
                    return true;
                }
                // 若当前位置不存在元素则放入
                temp = numbers[numbers[i]];
                numbers[numbers[i]] = numbers[i];
                numbers[i] = temp;
            }
        }
        return false;
    }
}
全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务