1.用两个栈实现队列
class CQueue {
stack<int> s1,s2;
public:
CQueue() {
while(!s1.empty()){
s1.pop();
}
while(!s2.empty()){
s2.pop();
}
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if(s2.empty()){
while(!s1.empty()){
s2.push(s1.top());
s1.pop();
}
}
if(s2.empty()) return -1;
else{
int temp=s2.top();
s2.pop();
return temp;
}
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
2.数组中重复的数字
补充知识:用数组来实现简单的哈希表,把数组的下标设为哈希表的键值,把数组中的每一个数字设为哈希表的值,有了这样的哈希表,我们就可以在O(1)时间内实现查找。
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
方法一:哈希表/set
从头到尾按顺序扫描数组的每个数字,每扫描到一个数字的时候,都可以用O(1)的时间来判断哈希表里是否已经包含了该数字。如果哈希表里还没有这个数字,就把它加入哈希表。如果哈希表里已经存在该数字,就找到一个重复的数字。这个算法的时间复杂度为O(n)
方法二:原地交换。
利用题目中的条件:所有数字都在0到n-1的范围内。
方法三:排序。
从排序数组中找出一个重复的数字很简单,只需要从头到尾扫描排序后的数组就可以了。??
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
/*unordered_map<int,int> m;
for(int i=0;i<nums.size();i++){
if(m.count(nums[i])) return nums[i];
else m[nums[i]]=i;
}
return 0;*/
/*sort(nums.begin(),nums.end());
for(int i=1;i<nums.size();i++){
if(nums[i]==nums[i-1]) return nums[i];
}
return 0;*/
int temp=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==i) continue;
else if(nums[i]==nums[nums[i]]) return nums[i];
else {
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return 0;
}
};
3.二维数组中的查找
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置。充分利用题目中给的条件,从二维数组的右上角开始查找,如果当前元素等于目标值则返回true;如果当前元素小于目标值,则移到下边一行(列标不变);如果当前元素大于目标值,则移到左边一列(行标不变)。
class Solution {
public:
if(matrix.size()==0) return false;
int rows=matrix.size(),columns=matrix[0].size();
int row=0; int column=columns-1;
while(row<rows&&column>=0){
if(matrix[row][column]==target) return true;
else if(matrix[row][column]<target) row++;
else column--;
}
return false;
}
};