剑指offer(一)用两个栈实现队列+数组中重复的数字+二维数组中的查找

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;
 }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值