zoukankan      html  css  js  c++  java
  • First duplicate value

    From : https://www.algoexpert.io/questions/First%20Duplicate%20Value


    First duplicate value

    1. problem statement

    给定一个长度为n的数组,这个数组包含的整数的范围在[1,n],我们需要找到第一个有重复的整数,如果数组包含多个重复的数字,则返回索引号最小的那个数字;如果没有重复的,返回-1.

    2. brute force. (O(n^2), O(1)) 穷举算法。

    遍历整个数组,对于数组里的每一个元素,遍历内层for loop在[i+1,n]中寻找它的重复元素,一旦array[I] == array[j],更新min_index,遍历结束之后返回min_index所对应的元素值。

    initialize the min_index as array.length, if min_index = array.length, return -1.

     1 class Program {
     2 
     3   public int firstDuplicateValue(int[] array) {
     4         int n = array.length;
     5         int min_index = n; // initialze the min_index as the length of array.
     6         
     7         for(int i = 0; i < n; i++){
     8             int value_a = array[i];
     9             for(int j = i+1; j < n; j++){
    10                 int value_b = array[j];
    11                 if(value_a == value_b){
    12                     min_index = Math.min(min_index, j);//update the min_index
    13                 }
    14             }
    15         }        
    16         if(min_index == n){//no duplicate values in the array
    17             return -1;
    18         }
    19         return array[min_index];//return the value, not just the index!!!
    20   }
    21 }

    3. Hash map(O(n), O(n))

    用哈希表存储unique values,然后检查重复元素,一旦找到了直接返回。(找到的第一个重复元素即为所求)

    HashSet: 不允许重重元素

    HashMap: 允许重复元素

     1 class Program {
     2 
     3   public int firstDuplicateValue(int[] array) {
     4     HashSet<Integer> set = new HashSet<Integer>();
     5         
     6         for(int value: array){
     7             if(set.contains(value)){
     8                 return value;
     9             }else{
    10                 set.add(value);
    11             }
    12         }
    13         return -1;
    14   }
    15 }

    4. index mapping (O(n), O(1))

    充分利用数组里面所存的元素的值属于[1,n], map the values by their indexes.

    index = value-1

    same value==same index, set array[value - 1] *= -1

    if array[value - 1] < 0, return value

    why value-1?, range of values:[1,n], value-1: [0,n-1], index is in [0,n-1].

     1 class Program {
     2 
     3   public int firstDuplicateValue(int[] array) {
     4     // Write your code here.
     5         for(int value: array){
     6             int absValue = Math.abs(value);//update the index.
     7             if(array[absValue-1]<0) return absValue;
     8             array[absValue-1] *= -1;
     9         }
    10     return -1;
    11   }
    12 }
  • 相关阅读:
    Linux问题汇总
    Linux问题汇总
    朴素贝叶斯分类器
    捕捉异常信息
    异常处理类
    sqlserver2008链接服务器的使用和oracle11g客户端修改字符集
    抛出异常
    添加水印
    验证码
    sqlserver数据库备份
  • 原文地址:https://www.cnblogs.com/LilyLiya/p/14224726.html
Copyright © 2011-2022 走看看