《剑指Offer》JZ3 数组中重复的数字

简介: 《剑指Offer》JZ3 数组中重复的数字

题目:JZ3 数组中重复的数字

描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

数据范围:0\le n \le 10000 \0≤n≤10000

进阶:时间复杂度O(n)\O(n) ,空间复杂度O(n)\O(n)

示例1

输入

[2,3,1,0,2,5,3]

返回值:

2

说明:

2或3都是对的

代码:

解题思路:

思路一:循环两次一个个去算有没重复,时间复杂度O(n2)

思路二:先排序,然后遍历搜索重复的数字O(logn)

思路三:空间换时间,时间复杂度O(n)+空间复杂度O(n)

思路四:时间复杂度O(n)

package 剑指offer;

import java.util.Arrays;
import java.util.HashSet;

public class JZ3数组中重复的数字 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    int numbers[]  = {2,3,1,0,2,5,3};
    int result  = duplicate(numbers);
    System.out.println(result);
  }
  public static int duplicate (int[] numbers) {
        // write code here
    int s = function4(numbers);
    return s;
    }
  
//  思路一:循环两次一个个去算有没重复,时间复杂度O(n2)
//  运行时间:96ms  超过20.53% 用Java提交的代码
//  占用内存:12592KB  超过94.60%用Java提交的代码
  public static int function1(int[] numbers) {
    for (int i = 0; i < numbers.length; i++) {
      int t = numbers[i];
      for (int j = i+1; j < numbers.length; j++) {
        if(t==numbers[j]) {
          return t;
        }
      }
    }
    return -1;
  }
//  思路二:先排序,然后遍历搜索重复的数字O(logn)
//  运行时间:62ms  超过98.97% 用Java提交的代码
//  占用内存:12756KB 超过81.62%用Java提交的代码
  public static int function2(int[] numbers) {
    Arrays.sort(numbers);
    for(int i=0;i<numbers.length;i++) {
      if(numbers[i]==numbers[i+1]) {
        return numbers[i];
      }
    }
    return -1;
  }
//  思路三:空间换时间,时间复杂度O(n)+空间复杂度O(n)
//  运行时间:69ms  超过80.03% 
//  占用内存:12744KB   超过82.90%
  public static int function3(int[] numbers) {
    int[] temp = new int[numbers.length];
    Arrays.fill(temp, -1);
    for (int i = 0; i < numbers.length; i++) {
      if(temp[numbers[i]]!=-1) {
        return numbers[i];
      }
      temp[numbers[i]]=numbers[i];
    }
    return -1;
  }
//  思路四:时间复杂度O(n)hashSet实现
//  运行时间:91ms  超过32.78% 
//  占用内存:14332KB  超过8.31%
  public static int function4(int[] numbers) {
    HashSet<Integer> hashSet = new HashSet<>();
    for (int i = 0; i < numbers.length; i++) {
      boolean flag = hashSet.add(numbers[i]);
      if(flag==false) return numbers[i];
    }
    return -1;
  }
}

相关文章
|
6月前
《剑指Offer》JZ4 二维数组中的查找
《剑指Offer》JZ4 二维数组中的查找
32 2
|
算法 C++
剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)
剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)
|
6月前
|
Java
每日一题《剑指offer》数组篇之数组中重复的数字
每日一题《剑指offer》数组篇之数组中重复的数字
55 0
每日一题《剑指offer》数组篇之数组中重复的数字
【剑指offer】- 数组中重复的数字 -48/67
【剑指offer】- 数组中重复的数字 -48/67
|
算法 C++
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
剑指offerJZ50 数组中重复的数字
剑指offerJZ50 数组中重复的数字
45 0
剑指offer JZ37数字在排序数组中出现的次数
剑指offer JZ37数字在排序数组中出现的次数
47 0
|
存储 C++ 容器
【九章斩题录】C/C++:数组中重复的数字(JZ3)
【九章斩题录】C/C++:数组中重复的数字(JZ3)
49 0
|
存储 算法 C++
剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)
剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)
|
算法 测试技术 C++
剑指offer(C++)-JZ20:表示数值的字符串(算法-模拟)
剑指offer(C++)-JZ20:表示数值的字符串(算法-模拟)