-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
77 lines (72 loc) · 1.92 KB
/
main.cpp
File metadata and controls
77 lines (72 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Source: https://leetcode.com/problems/find-the-duplicate-number
// Title: Find the Duplicate Number
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Given an array of integers `nums` containing`n + 1` integers where each integer is in the range `[1, n]` inclusive.
//
// There is only **one repeated number** in `nums`, return thisrepeatednumber.
//
// You must solve the problem **without** modifying the array `nums`and using only constant extra space.
//
// **Example 1:**
//
// ```
// Input: nums = [1,3,4,2,2]
// Output: 2
// ```
//
// **Example 2:**
//
// ```
// Input: nums = [3,1,3,4,2]
// Output: 3
// ```
//
// **Example 3:**
//
// ```
// Input: nums = [3,3,3,3,3]
// Output: 3```
//
// **Constraints:**
//
// - `1 <= n <= 10^5`
// - `nums.length == n + 1`
// - `1 <= nums[i] <= n`
// - All the integers in `nums` appear only **once** except for **precisely one integer** which appears **two or more** times.
//
// **Follow up:**
// - How can we prove that at least one duplicate number must exist in `nums`?
// - Can you solve the problem in linear runtime complexity?
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <cstdint>
#include <vector>
using namespace std;
// Hash Map
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size();
auto visited = vector<bool>(n);
for (auto num : nums) {
if (visited[num]) return num;
visited[num] = true;
}
return 0;
}
};
// Use array sign as hash map
class Solution2 {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size();
for (auto i = 0; i < n; ++i) {
auto num = abs(nums[i]);
if (nums[num] < 0) return num;
nums[num] = -abs(nums[num]);
}
return 0;
}
};