1. 程式人生 > >解決數組中重復的數字

解決數組中重復的數字

所有 人的 lose 易懂 color 容易 || 額外 。。

今天寫了一道算法題。

對於我這個菜鳥來說連看懂答案都是一件不容易的事情。

但是

路漫漫其修遠兮 吾將上下而求索

所以我是不會泄氣的,一定要加強修行,為了生活吧

這道題是劍指上的

看一下題目描述

在一個長度為 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。數組中某些數字是重復的,但不知道有幾個數字是重復的,也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。

我首先想到的最粗糙的方法就是雙重for循環,不用說,這種方法肯定是不通過的,它的空間和時間的效率都不高

所以我選擇看答案。

汗顏的是。。答案都不怎麽理解。。

認真研究了一下,我這裏用自己粗鄙的方式來描述一下吧

首先看代碼

技術分享圖片
 1    public static boolean duplicate(int[] nums, int length, int[] duplication) {
 2         if (nums == null || length <= 0){
 3             return false;
 4         }
 5         for (int i=0;i<length;i++){
 6             while (nums[i] != i){
 7                 if (nums[i] == nums[nums[i]]){
8 duplication[0] = nums[i]; 9 System.out.println(duplication[0]); 10 return true; 11 } 12 swap(nums,i,nums[i]); 13 } 14 } 15 return false; 16 } 17 18 public static
void swap(int []nums,int i,int j){ 19 int t = nums[i]; 20 nums[i] = nums[j]; 21 nums[j] = t; 22 }
View Code

這是給大家看一下官方的解題思路

要求是時間復雜度 O(N),空間復雜度 O(1)。因此不能使用排序的方法,也不能使用額外的標記數組。

對於這種數組元素在 [0, n-1] 範圍內的問題,可以將值為 i 的元素調整到第 i 個位置上進行求解。

以 (2, 3, 1, 0, 2, 5) 為例,遍歷到位置 4 時,該位置上的數為 2,但是第 2 個位置上已經有一個 2 的值了,因此可以知道 2 重復:

可以說已經很通俗易懂了。

但我當時怎麽就不理解呢。。

我這裏說一下自己的看法吧,呃呃,言辭可能有些粗鄙,大家不要介意哈

我們看到,duplication方法接收三個參數,分別是數組,數組長度,和重復元素放置的數組

先判斷一下空和長度,沒毛病

這裏for循環開始遍歷數組

這麽說吧,假設由一百個數,如果每個數都是唯一的,那麽它們都有一個唯一和值相對應的地址。可以理解為一百個人占坑

從頭開始判斷,看看這個坑是不是它自己的,如果是就留下,進入下一次循環,如果不是的話就判斷一下這個坑有沒有給人占了

如果發現,自己的坑有人占了!那麽問題來了,這個人的標號跟自己肯定是相同的,也就是說出現了重復元素

如果未被占,那麽就可以放心的去自己的坑,繼續下一次循環,一直到發現重復元素或遍歷結束返回true或者false

那麽,今天的總結就這樣

解決數組中重復的數字