数组中重复的数字
- 题目详情【easy】
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
数据范围:0≤n≤10000
进阶:时间复杂度O(n) ,空间复杂度O(n)
-
解法1——哈希表
这个题目中提到数值范围 [ 0 , n − 1 ] [0,n-1] [0,n−1],从零开始,很符合数组的行事风格!
我们需要开辟一个固定的n
长度的数组当作Hash(x)
哈希表,
作用: 记录每个数值出现的次数!!- 代码详情
int duplicate(vector<int>& numbers) { //哈希 int n=numbers.size(),temp,i=0;//计算数组长度 int a[n]; //初始化 for(i=0;i<n;i++){ a[i]=0; } for(i=0;i<n;i++){ temp=numbers[i]; a[temp]++; } for(i=0;i<n;i++){ cout << a[i] << endl; if(a[i]>1){ return i; } } return -1; }
- 代码详情
-
解法2——排序
sort
邻居
对于任何一个数组元素,将其升序or降序排序之后,
若存在相同的数值,该值一定在是邻居。- 代码详情
int duplicate(vector<int>& numbers) { //使用sort排序 sort(numbers.begin(),numbers.end()); for(int i=0;i<numbers.size();i++){ int j=i+1; if(numbers[i]==numbers[j]){ return numbers[i]; } } return -1; }
- 代码详情
二维数组中的查找
- 题目详情【medium】
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0≤n,m≤500, 矩阵中的值满足 0≤val≤109
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
-
解法1——暴力求解
题目要求:查找是否存在target
值。
面对这样的需求,笔者一瞬便想到使用set
集合进行检查。但是时间复杂度很高!也不是很推荐使用…
set
中的每一个元素都具备唯一性!
我们只需要将二维数组中所有数值放入set
中就可以知道该二维数组中存在的所有不同的数值【并且还是有序的】。
再利用set
中的find函数查找target
值即可。set
中的find()
函数须知
若set中找不到target
值,find()
会返回set.end()
【也就是set集合的个数位置】。
如果找到target
值了,就放回当前target
值的📌迭代器位置~【也就是说,返回的是一个指针】
📓 取值时别忘了加上*
⭕️ 判断是否找到target
值if (set.find(target) != set.end()){//检索成功!找到target值 return true; } else return false;
- 代码详情
bool Find(int target, vector<vector<int> >& array) { // write code here int col=array.size(),row=array[0].size(); set<int> li; for(int i=0;i<col;i++){ for(int j=0;j<row;j++){ li.insert(array[i][j]); } } for(set<int>::iterator it=li.begin();it!=li.end();it++){ cout << *it << endl; } if(li.find(target)!=li.end()){ return true; } return false; }
反转链表输出
- 题目详情【easy】
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
- 解法1——辅助栈
反向输出 ⇒ \Rightarrow ⇒ 先进后出
开辟一个长度与链表长度相同的辅助栈空间
利用head
遍历到链表尾,同时将链表从头到尾存入栈中。
再将栈倒出就是逆序输出啦!~
-
代码详情
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ class Solution { public: vector<int> printListFromTailToHead(ListNode* head) { stack<int> st; while(head!=nullptr){ st.push(head->val); head=head->next; } vector<int> li; while(!st.empty()){ li.push_back(st.top()); st.pop(); } for(vector<int>::iterator it=li.begin();it!=li.end();it++){ cout << *it; } return li; } };
-