<力扣刷题>442. 数组中重复的数据
前言
人生如逆旅,我亦是行人。————苏轼《临江仙·送钱穆父》
题:
- 给你一个长度为
n
的整数数组nums
,其中nums
的所有整数都在范围[1, n]
内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。 - 你必须设计并实现一个时间复杂度为
O(n)
且仅使用常量额外空间的算法解决此问题。
示例1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例2:
输入:nums = [1,1,2]
输出:[1]
示例3:
输入:nums = [1]
输出:[]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
nums
中的每个元素出现 一次 或 两次
编写代码(c++)
思路(原地哈希):
- 由于给定的
n
个数都在[1, n]
的范围内,如果有数字出现了两次,就意味着[1,n]
中有数字没有出现过。 nums
的所有整数都在范围[1,n]
内,将题目给的数组当成一个哈希表,而哈希函数为:hash(value) = value − 1
,- 首先,我们的数组下标是
[0, n - 1]
的,而数据范围是[1, n]
,如果数据范围内的数字每个都出现一次,那么很容易就能找到nums[val - 1] = val
的哈希函数使得每个数值不重不漏的映射到唯一的数组下标,并填满整个数组。 - 若有整数出现不止一次,那么必定某些数值缺少,而缺失数值的位置被重复的数值占据了,我们只需调整数组满足上述的哈希映射,即可很容易找到重复的数据。
class Solution {
public:vector<int> findDuplicates(vector<int>& nums) {int n = nums.size();for (int i = 0; i < n; ++i) {for (int j = nums[i]; j != i + 1 && j != nums[j - 1]; j = nums[i]) {int tmp = nums[i];nums[i] = nums[j - 1];nums[j - 1] = tmp;}}vector<int> ans;for (int i = 0; i < n; ++i)if (i != nums[i] - 1)ans.emplace_back(nums[i]);return ans;}
};
swap()函数
- 在许多应用程序中,都有交换相同类型的两个变量内容的需要。例如,在对整数数组进行排序时,将需要一个函数来交换两个变量的值,如下所示:
void swap(int &a, int &b)
{int temp = a;a = b;b = temp;
}
- 而在对一个数组字符串对象进行排序的时候,会需要以下函数:
void swap(string &a, string &b)
{string temp = a;a = b;b = temp;
}
- 因为这两个函数中代码的唯一区别就是被交换的变量的类型,所以这两个函数的逻辑与所有其他类似函数的逻辑都可以使用同一个模板函数来表示:
template<class T>
void swap(T &a, T &b)
{T temp = a;a = b;b = temp;
}
- 该函数在
<algorithm>
头文件中声明。 - 下面的程序讲述如何使用这个库模板函数来交换两个变量的内容:
//这个程序演示了交换函数模板的使用。
#include <iostream>
#include <string>
#include <algorithm> // Needed for swap
using namespace std;int main ()
{// 获取并交换两个字符char firstChar, secondChar;cout << "Enter two characters: ";cin >> firstChar >> secondChar;swap(firstChar, secondChar);cout << firstChar << " " << secondChar << endl;// 获取并交换两个整型变量int firstInt, secondInt;cout << "Enter two integers: ";cin >> firstInt >> secondInt;swap(firstInt, secondInt);cout << firstInt << " " << secondInt << endl;//获取并交换两个字符串cout << "Enter two strings: ";string firstString, secondString;cin >> firstString >> secondString;swap(firstString, secondString);cout << firstString << " " << secondString << endl;return 0;
}
结果:
注:C++ 中 vector<vector <int>
>
vector
是模板而非类型,由vector
生成的类型必须包含vector
中元素的类型,如:vector< int>
;
标准库模型 vector
表示对象的集合,其中所有对象的类型都相同。集合中每个对象都有一个与之对应的索引,索引用于访问对象。
- 两种方法对
vector< vector< int>>
进行赋值的方法:
- 采用 vector 模板中的方法 push_back()
#include<iostream>
#include<vector>
using namespace std;int main()
{//array用来保存一个3*3的二维数组,array的每个元素都是vector<int>类型vector <vector<int> >array;std::vector<int> v;for (int i = 0; i <3; i++){for (int j = 0; j <3; j++){int value;cin >> value;v.push_back(value);}array.push_back(v); //保存array的每个元素v.clear();}for (int i = 0; i <array.size(); i++){for (int j = 0; j <3; j++)cout <<array[i][j];cout<<endl;}return 0;
}
- 用分配空间的resize()函数
#include<iostream>
#include<vector>
using namespace std;int main()
{vector <vector<int> >array(3);//首先给array开辟了三个空间for (int i = 0; i <3; i++){array[i].resize(3);//给array中每个元素开辟了三个空间for (int j = 0; j <3; j++){cin >> array[i][j];//直接对开辟的空间赋值即可}}for (int i = 0; i <array.size(); i++){for (int j = 0; j <3; j++)cout <<array[i][j];cout<<endl;}cout << array.size();return 0;
}
方法1中是首先确定一个vector< int>
类型对象,然后把它push_back()
到array
中去;方法2是用开辟空间的函数resize()
,这样能直接当作数组进行赋值。
结果:
<力扣刷题>442. 数组中重复的数据相关推荐
- angularjs 元素重复指定次数_[LeetCode] 442. 数组中重复的数据
[LeetCode] 442. 数组中重复的数据 题目链接: https://leetcode-cn.com/problems/find-all-duplicates-in-an-array 难度:中 ...
- 努力前端【LeetCode-10】448. 找到所有数组中消失的数字 442. 数组中重复的数据(中等) 41. 缺失的第一个正数(困难) [鸽笼原理,数组,Map,类似No.645]
文章目录 题目描述-448 一.哈希Map 二.空间复杂度的优化--鸽笼原理 三.总结 题目描述-442 一.还是hashMap 二.继续鸽笼原理 题目描述-41 一.基础方案 二.数组模拟Map 题 ...
- 442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次. 找到所有出现两次的元素. 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题 ...
- leetcode 442. Find All Duplicates in an Array | 442. 数组中重复的数据(位运算)
题目 https://leetcode.com/problems/find-all-duplicates-in-an-array/ 题解 没想出来,看了评论之后写的,一语点醒. 思路就是,用num对应 ...
- Array.splice()--删除数组中重复的数据
splice方法 从一个数组中移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素. 用法 my_array.splice(start, deleteCount [, val ...
- leetcode442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次. 找到所有出现两次的元素. 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题 ...
- Leetcode--442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次. 找到所有出现两次的元素. 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题 ...
- 请编写fun()函数,函数的功能是删去一维数组中相同的数据在一起出现的数,相同的数只保留一个
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p143 7.1.2 上级实训内容 [实训内容13]请编写fun()函数,函数的功能是删去一维数组中相同 ...
- leetcode-找出数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
最新文章
- ttc转ttf在线网站_文件格式怎么在线互转?迅捷PDF转换器告诉你
- server 2008 R2 使用笔记
- 详解基于 Cortex-M3 的任务调度(下)
- selenium测试(Java)--学习总结
- Android之事件处理全面剖析
- 使用Java将HTML转成Word格式文件
- 动动手指头, Feed 流系统亿级规模不用愁
- Vue项目启动报错 error:cannot find module xxx
- c++ 结构体中不同类型的初始值_Golang语言基础教程:结构体
- 函数指针的定义和函数指针数组
- ibatis动态的传入表名、字段名
- 使计算机进入休眠状态
- 写给.NET开发者的数据库Migration方案
- HttpRequest 和HttpWebRequest的区别
- php的在线问卷调查_php 在线问卷调查程序一
- 适合普通大学生的前端开发学习路线
- 小觅相机运行VINS-Fusion(二)——Camera-IMU参数标定
- Java+spring基于ssm的基于SSM的高校奖学金助学金管理系统
- 被收割的人,是拦不住的
- Mach-O入门理解