Leetcode 劍指 Offer 03. 陣列中重複的數字
找出陣列中重複的數字。
在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。
示例 1:
輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
限制:
2 <= n <= 100000
1.排序
時間:O(nlogn) 空間: O(1)
程式碼
// #include "swap.h"
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i = 0; i < nums.size()-1; ++i)
{
if(nums[i] == nums[i+1]) return nums[i];
}
return -1;
}
};
int main()
{
Solution s;
vector<int> prices{2, 3, 1, 0, 2, 5, 3};
s.findRepeatNumber(prices);
cout << s.findRepeatNumber(prices) << endl;
system("pause");
return 0;
}
2.雜湊
時間:O(n) 空間:O(n)
程式碼
// #include "swap.h"
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map <int,int> m;
for(int num : nums)
{
if(++m[num] > 1) return num;
}
return -1;
}
};
int main()
{
Solution s;
vector<int> prices{2, 3, 1, 0, 2, 5, 3};
s.findRepeatNumber(prices);
cout << s.findRepeatNumber(prices) << endl;
system("pause");
return 0;
}
3.原地雜湊
時間:O(n) 空間:O(1)
因為陣列值的範圍小於陣列的大小,我們可以通過下標實現雜湊的功能,將陣列元素放到與自身值相等的下標處,如果出現重複返回重複數字
程式碼
// #include "swap.h"
#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i = 0; i < nums.size(); ++i)
{
while(nums[i] != i) //當前元素不等於下標
{
if(nums[i] == nums[nums[i]]) return nums[i];
swap(nums[i],nums[nums[i]]);
}
}
return -1;
}
};
int main()
{
Solution s;
vector<int> prices{2, 3, 1, 0, 2, 5, 3};
s.findRepeatNumber(prices);
cout << s.findRepeatNumber(prices) << endl;
system("pause");
return 0;
}
相關文章
- 劍指Offer--陣列中重複的數字陣列
- [劍之offer] 03 陣列中重複的數字陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 陣列中重複的數字陣列
- Leetcode 劍指 Offer 39. 陣列中出現次數超過一半的數字LeetCode陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指offer之列印超過陣列一半的數字陣列
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 【劍指offer】二維陣列中的查詢陣列
- (python版)《劍指Offer》JZ06:旋轉陣列的最小數字Python陣列
- 劍指Offer-37-陣列中逆序對陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- JZ-050-陣列中重複的數字陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- leetcode 劍指 Offer 48. 最長不含重複字元的子字串LeetCode字元字串
- 每日一題 - 劍指 Offer 53 - I. 在排序陣列中查詢數字 I每日一題排序陣列
- LeetCode|劍指 Offer 49.醜數LeetCode
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指offer之順序列印陣列陣列
- 力扣 - 劍指 Offer 45. 把陣列排成最小的數力扣陣列
- 0二分查詢簡單 牛客NC.71旋轉陣列的最小數字 leetcode劍指 Offer 11. 旋轉陣列的最小數字陣列LeetCode
- [劍指offer題解][Java]陣列中出現次數超過一半的數字Java陣列
- Leetcode劍指offer(八)LeetCode
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- 劍指 offer 第一題: 二維陣列中的查詢陣列