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 }
  • 相关阅读:
    如何利用迅雷下载百度云?
    Windows 8.1/Server 2012 R2/Embedded 8.1 with Update 3(MSDN最新版)
    Visual Studio 2013 and .NET 4.6
    明朝那些事儿的作者的经历
    嵌入式OS的现状、智能的物联网与未来的机器人
    系统战略+极致运营=战无不胜的千机团
    惠普笔记本按开机键后电源灯亮的,但是屏幕一直是黑的,只有大写锁定键闪烁,闪3次一个循环,听得到风扇
    Android平台免Root无侵入AOP框架Dexposed使用详解
    iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)
    ios app 实现热更新(无需发新版本实现app添加新功能)
  • 原文地址:https://www.cnblogs.com/ERFishing/p/11823161.html
Copyright © 2011-2022 走看看