剑指offer 第一题
去力扣里测试算法
思路一:
排序后,前一个与后一个相比是否相同。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n;
int len = nums.size();
vector<int> ans;
for (int i = 0; i < len; i++)
{
if (nums[i] == n){
ans.push_back(nums[i]);
}
n = nums[i];
}
return ans;
}
};
若本地运行:
#include <iostream>
#include<algorithm>
#include <vector>
using namespace std;
int main()
{
vector <int> nums{ 4, 3, 2, 7, 8, 2, 3, 1 };
for (auto i : nums) {
cout << i << "";
}
cout << " " << endl;
sort(nums.begin(), nums.end());
vector<int> ans;
int n1;
int len = nums.size();
for (int i = 0; i < len; i++)
{
cout << n1 << "";
if (nums[i] == n1) {
ans.push_back(nums[i]);
}
n1 = nums[i];
}
for (auto i : ans) {
cout << i << endl;
}
return 0;
}
思路二:
遍历所有,放入哈希表中,若发现哈希表内已经存在该元素,说明有重复的。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
unordered_map<int, int> m{};
vector<int> ans;
for (unsigned int i{ 0 }; i < nums.size(); i++)
{
if (m.count(nums[i])) {
ans.push_back(nums[i]);
}
else {
m[nums[i]] = nums[i];
}
}
return ans;
}
};
若本地运行
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main()
{
vector <int> nums{ 4, 3, 2, 7, 8, 2, 3, 1 };
for (auto i : nums) {
cout << i << "";
}
cout << " " << endl;
unordered_map<int, int> m{};
vector<int> ans;
for (unsigned int i{ 0 }; i < nums.size(); i++)
{
if (m.count(nums[i])) {
cout << nums[i] << endl;
ans.push_back(nums[i]);
}
else {
m[nums[i]] = nums[i];
}
}
return 0;
}
牛客网的算法题
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
sort(numbers.begin(), numbers.end());
int n = 0;
int len = numbers.size();
for (unsigned int i =0; i < len; i++)
{
// 第一个数赋值
if (i == 0){
n = numbers[i];
}
if (i >= 1){
if (numbers[i] == n){
return n;
}
}
n = numbers[i];
}
return -1;
}
};