劍指offer50 陣列中重複的數字 題解

2022-07-26 12:51:10 字數 1306 閱讀 6403

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

返回描述:

如果陣列中有重複的數字,函式返回true,否則返回false。

如果陣列中有重複的數字,把重複的數字放到引數duplication[0]中。(ps:duplication已經初始化,可以直接賦值使用。)

演算法流程:

初始化: 新建 \(map\) ,記為 \(dic\) ;

遍歷陣列 \(nums\) 中的每個數字 \(num\) :

當 \(num\) 在 \(dic\) 中,說明重複,返回 \(num\) ;

將 \(num\) 新增至 \(dic\) 中;

返回 \(false\) 。

/**

1.時間複雜度:o(n)

2.空間複雜度:o(n)

**/class solution

}return false;

}};

演算法思想:

利用現有陣列設定標誌,當乙個數字被訪問過後,設定該數字對應索引的數值 \(-n\)

當再次遇到相同數字時,會發現該數字對應索引上的數值已經小於0,直接返回這個數即可。

演算法流程:

遍歷陣列 \(numbers\) 的每個數字 \(num\)

設定索引 \(index\) 為 \(num\)

當 \(index<0\) 時,將 \(index\) 加 \(n\) 作為索引,保證 \(index\) 始終為初始值

當 \(numbers[index]>=0\) 時,將 \(numbers[index]\) 減 \(n\),由於每個數字 \(num\) 保證在 \([0,n-1]\),所以一定有 \(numbers[index]<0\) ,代表 \(index\) 已經被訪問過

當 \(numbers[index]<0\) 時,說明 \(index\) 指向的該數字之前已經被訪問過,返回 \(index\) 即可

返回 \(false\) ,沒有找到該數字

/**

1.時間複雜度:o(n)

2.空間複雜度:o(1)

**/class solution

if (numbers[index] >= 0)

else

}return false;

}};

劍指offer 50 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。這道題是比較基礎,主要思路如下 首先判斷陣列是否為空,若為空直接返回...

劍指Offer(50) 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。1 將陣列連線成字串變數stringbuilder 2 按位遍歷字串...

劍指offer 50 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 解法一 雜湊表 時間o n 空間o n class solut...