剑指offer刷题

03 数组中重复的数字

在一组数组中找到重复的数,任意找到一组就行 ,善用哈希表。

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        unordered_set<int> res;
        int tmp;
        for(int i=0;i<nums.size();i++)
        {
            if(res.find(nums[i])==res.end())  //这个意思是找不到,就插入
            {
                res.insert(nums[i]);
            }else
            {
               
               tmp=nums[i];  //找到弹出就行
               break;
            }
        }
         return tmp;
    }
};

剑指offer 04二维数组中的查找。

这里用递归,从一个角开始。

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.size() == 0)
            return false;
        int x = 0,y = matrix[0].size() - 1;  //上右三角
        while(x < matrix.size() && y >= 0)
        {
            if(matrix[x][y] > target)
                y--;
            else if(matrix[x][y] < target)
                x++;
            else 
                return true;
        }
        return false;
    }
};

剑指offer 06 从尾部到头部返回链表的值。

这里用一个栈,塞进去,然后出栈就行了。 

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
         stack<int>stk;
         vector<int>res;
         ListNode *p=head;
         while(p!=nullptr)
         {
             stk.push(p->val);
             p=p->next;
         }
         while(!stk.empty())
         {
             int a=stk.top();//返回栈顶元素
             res.push_back(a);
             stk.pop();//删除栈顶元素
         }
         return res;

    }
};

剑指offer09 两个栈实现队列

class CQueue {
public:
    stack<int> stack1;
    stack<int> stack2;
    CQueue() {}
    
    void appendTail(int value) {
        stack1.push(value);
    }
    
    int deleteHead() {
        if (stack1.empty()) return -1;
        
        while (!stack1.empty()){ // 1 -> 2
            int tmp = stack1.top();
            stack1.pop();
            stack2.push(tmp);
        }
        // delete head
        int res = stack2.top();
        stack2.pop();
        while (!stack2.empty()){ // 1 <- 2
            int temp = stack2.top();
            stack2.pop();
            stack1.push(temp);
        }
        return res;
    }
};

 剑指offer 11 旋转数组的最小值,旋转的话,肯定是从中间到最大,这些值都比右边的大,中间值与右边的相比,就比右边大的时候,说明旋转点在右边,接口在右边,这时候就区间调到右边。

当中间值比右边小时,说明旋转拼接点在左边。最小值也在左边。这时候选j+1,有可能最小的就是这个了。

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int n=numbers.size();
        int i=0,j=n-1;
        
        while(i<j)
        {
            int m=i+(j-i)/2;
            if(numbers[m]>numbers[j])
            {
            i=m+1;
            }else if(numbers[m]<numbers[j])
            {
                j=m;
            }
            else
            j--;
        }
        return numbers[i];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值