1. 程式人生 > 其它 >【劍指offer中等部分20】陣列中重複的數字(java)

【劍指offer中等部分20】陣列中重複的數字(java)

技術標籤:劍指offerjava資料結構演算法

一、題目描述

在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
返回描述:
如果陣列中有重複的數字,函式返回true,否則返回false。
如果陣列中有重複的數字,把重複的數字放到引數duplication[0]中。(ps:duplication已經初始化,可以直接賦值使用。)

二、分析

2.1 方法一

分析:第一為常規解法,我們可以用一個boolean陣列

來表示數字是否存在,存在就是true,不存在就是false,如[2,0,3,0,4,1,5],下標為1和3兩個位置上的數字都是0,即numbers[1]與numbers[3]均等於0,假設numbers[1]=0對應布林陣列arr[1]=true,走到index=3時,numbers[3]=0也是對應arr[0],此時arr[0]=true,表示已經有一個數字0,故返回true。

實現程式碼如下:

public class Solution {
    public boolean duplicate(int numbers[], int length, int [] duplication) {
        if
(numbers == null || length <= 1) { return false; } // 長度為n的布林陣列用於判斷數字是否存在 boolean[] arr = new boolean[length]; for (int i = 0 ; i < length ; i++) { int val = numbers[i]; // 判斷重複數字 if (arr[val] == true) { duplication[
0] = val; return true; } arr[val] = true; } return false; } }

在這裡插入圖片描述

2.2 方法二

分析:第二個方法是用java中的HashMap,HashMap由key值,values值兩部分組成,最重要的是map.containsKey(numbers[i])這個方法,作用是判斷對應值是否已經存在於map集合中,若未存在,則用map.put放進去,並且values值賦值為1,表示目前已經出現一次,若已經存在,則為第一次重複,我們就將重複值賦給duplication[0],並返回true。

實現程式碼如下:

import java.util.Map;
import java.util.HashMap;

public class Solution {
    public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(numbers == null || numbers.length <= 1)
        	return false;
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        boolean flag = false;
        for(int i=0 ; i<length ; i++){
            if(!map.containsKey(numbers[i])){
                map.put(numbers[i], 1);
            }else{
                duplication[0] = numbers[i];
                flag = true;
                break;
            }
        }
        return flag;
    }
}

在這裡插入圖片描述