經典算法題:數組中重複出現的數字

今天給你們帶來的是一道劍指offer上的題目,也是一道很經典的題目,常常在面試中出現,下面咱們來看一下題目描述吧java

題目說明:在一個長度爲 n 的數組 nums 裏的全部數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。請找出數組中任意一個重複的數字。面試

示例 1:算法

輸入: [2, 3, 1, 0, 2, 5, 3] 輸出:2 或 3數組

題目解析:該題題意很容易理解,只須要找出數組中的某一重複出現的數字便可。markdown

排序遍歷法:spa

咱們今天主要經過三種作法解決該題,第一種方法咱們能夠先對其排序,而後進行遍歷當發現重複元素時咱們直接返回該元素便可,這種方法比較容易理解,也比較容易實現,你們能夠試一下。code

class Solution {
    public int findRepeatNumber(int[] nums) {
         Arrays.sort(nums);//排序
         //循環遍歷
         for(int i = 1; i<nums.length ;i++){
            //若是相等則返回
             if(nums[i] == nums[i-1]){
                 return nums[i];
             }
         }
         return -1;
    }
}
複製代碼

哈希表:orm

第二種方法就是藉助咱們的哈希表,遍歷數組,利用哈希表存儲遇到過的數字,若是哈希表已經存儲過該數字則直接返回便可。這種方法也比較簡單。視頻

下面咱們來看代碼吧排序

class Solution {
    public int findRepeatNumber(int[] nums) {
        HashSet<Integer> arr = new HashSet<>();      
        for(int num:nums){
            //若是已經存在則返回
            if(arr.contains(num)){
                return num;
            }
            //不存在則存入
            arr.add(num);
        }
        return 0;
    }
}
複製代碼

原地置換:

下面咱們看一下這個原地置換法,原地置換的整體思路就是將咱們的元素放到他的索引位置。咱們能夠這樣理解,每一個人都有本身的位置,咱們須要和別人調換回到屬於本身的位置,調換以後,若是發現咱們的位置上有人了,並且還和你同樣則返回。大體意思瞭解了,下面咱們代碼的執行過程吧。

重複出現的數字

題目代碼:

class Solution {
    public int findRepeatNumber(int[] nums) {
       for(int i = 0;i < nums.length;i++){
           //將當前索引下的元素歸位
           while(nums[i] != i){
               //發現相同數字,返回
               if(nums[i] == nums[nums[i]]){
                   return nums[i];
               }
               //將當前索引下的數字放到屬於他的位置,具體過程參考視頻視頻
               int temp = nums[i];
               nums[i] = nums[temp];
               nums[temp] = temp;
           }
       }
       return -1;
    }
}
複製代碼

你們若是能感受到這個文章寫的很用心的話,能給您帶來一丟丟幫助的話,能麻煩您給這個文章點個贊嗎?這樣我就巨有動力寫下去啦


你們須要更多經典題目的動圖詳解能夠關注公衆號:袁廚的算法小屋,更多精選算法題等着你呀,原創不易,感謝觀看

相關文章
相關標籤/搜索