zoukankan      html  css  js  c++  java
  • 数组中重复的数组Java实现[剑指offer]

    题目

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

    题解

    1通过排序实现

    1.1描述

    通过调用排序的方式,获得从小到大的数组,比较相邻的值是否相等,即可得到重复的元素,此时排序的时间复杂度为O(nlogn),空间复杂度为O(1)

    1.2code

     1 import java.util.*;
     2 public class Solution {
     3     public boolean duplicate(int numbers[],int length,int [] duplication) {
     4         if(numbers == null || length == 0){
     5             return false;
     6         }
     7         Arrays.sort(numbers);
     8         for(int i=0;i<length-1;i++){
     9             if(numbers[i] == numbers[i+1]){
    10                 duplication[0] = numbers[i];
    11                 return true;
    12             }
    13         }
    14         return false;
    15     }
    16 }

    2通过哈希表实现

    2.1描述

    扫描数组,判断当前的值是否存在哈希表中,若存在则是重复数字,若不存在就添加,时间复杂度O(n),空间复杂度O(n)

    2.2code

     1 import java.util.*;
     2 public class Solution {
     3     public boolean duplicate(int numbers[],int length,int [] duplication) {
     4         Set<Integer> set = new HashSet<>();
     5         for(int i =0 ;i<length;i++){
     6             if(set.contains(numbers[i])){
     7                 duplication[0] = numbers[i];
     8                 return true;
     9             }else{
    10                 set.add(numbers[i]);
    11             }
    12         }
    13         return false;
    14     }
    15 }

    3通过数组下标实现

    3.1描述

    扫描数组,判断下标为i的值是否等于i,若不等于i,则判断下标为numbers[i]的值是否等于numbers[numbers[i]],若等于则重复,不等于则交换,时间复杂度O(n),空间复杂度O(1)

    3.2code

     1 public class Solution {
     2     public boolean duplicate(int numbers[],int length,int [] duplication) {
     3         if(numbers==null||length==0){
     4             return false;
     5         }
     6         int num=0;//重复数字的下标
     7         //遍历数组
     8         for(int i=0;i<numbers.length;i++){
     9             //判断i是否等于numbers[i]
    10             while(i!=numbers[i]){//不等于,则判断m=numbers[i]是否等于numbers[m]
    11                 int m=numbers[i];
    12                 if(m==numbers[m]){//如果m下标的值等于i下标的值,就是重复的
    13                     duplication[0]=m;
    14                     return true;
    15                 }else{//如果m下标的值不等于i下标的值,就进行调换,将i下标的值调到m的位置,使得numbers[m]==m
    16                     numbers[i]=numbers[m];
    17                     numbers[m]=m;
    18                 }
    19             }
    20         }
    21          return false;
    22     }
    23 }
  • 相关阅读:
    SpringMVC笔记:annotation注解式开发
    HTTP协议状态码详解(HTTP Status Code)
    SpringMVC学习笔记:SpringMVC框架的执行流程
    述一个程序员的技能:系统安装(win7版)idea配置
    Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)
    Spring扩展:Spring框架的由来
    Spring学习笔记:spring整合web之spring-web架包的引用(WebApplicationContextUtils注入容器)
    Spring学习笔记:spring与mybatis四种整合方法
    MySQL修改root密码的多种方法
    为需要远程登录的用户赋予权限:
  • 原文地址:https://www.cnblogs.com/ERFishing/p/11823161.html
Copyright © 2011-2022 走看看