leetcode剑指offer合集+题解

Posted hesorchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode剑指offer合集+题解相关的知识,希望对你有一定的参考价值。

目录

一、用两个栈实现队列

题目

剑指 Offer 09. 用两个栈实现队列

解题思路

维护两个栈,一个维护插入,一个维护删除。需要删除的时候可以把插入栈里的元素全部倒进删除栈里,注意只有删除栈为空了,才会倒,否则会破坏元素的顺序。很巧妙。

AC代码

class CQueue

    stack<int> st1, st2;

public:
    CQueue()
    
        while (st1.size())
            st1.pop();
        while (st2.size())
            st2.pop();
    
    void appendTail(int value)
    
        st1.push(value);
    
    int deleteHead()
    
        if (!st2.size()) //为空才会倒,才能保证顺序正确
            while (st1.size())
            
                st2.push(st1.top());
                st1.pop();
            
        if (!st2.size())
            return -1;
        int res = st2.top();
        st2.pop();
        return res;
    
;

二、包含min函数的栈

题目

剑指 Offer 30. 包含min函数的栈

为栈新增功能, O ( 1 ) O(1) O(1)得到栈中最小值。

解题思路

如果当前压入的元素不是最小值,那么它一定不会作为最小值。所以我们只需要开一个辅助单调栈维护好每个“在压入时是最小值”的元素。

AC代码

class MinStack


public:
    stack<int> st, st2;

    MinStack()
    
        while (!st.empty())
            st.pop();
        while (!st2.empty())
            st2.pop();
    

    void push(int x)
    
        st.push(x);
        if (!st2.size() || x <= st2.top())
            st2.push(x);
    

    void pop()
    
        if (st2.size() && st.top() == st2.top())
            st2.pop();
        st.pop();
    

    int top()
    
        return st.top();
    

    int min()
    
        return st2.top();
    
;

三、从尾到头打印链表

题目

剑指 Offer 06. 从尾到头打印链表

解题思路

简单题,可以遍历一遍reverse,或者递归回溯打印。

AC代码

class Solution

public:
    vector<int> reversePrint(ListNode *head)
    
        vector<int> ans;
        if (head == nullptr)
            return ans;
        if (head->next != NULL)
        
            ans = reversePrint(head->next);
            ans.emplace_back(head->val);
        
        else
            ans.emplace_back(head->val);
        return ans;
    
;

四、反转链表

题目

剑指 Offer 24. 反转链表

解题思路

遍历并反转即可。

AC代码

class Solution

public:
    ListNode *reverseList(ListNode *head)
    
        vector<ListNode *> vec;
        ListNode *pre = nullptr;
        while (head != nullptr)
        
            vec.emplace_back(head);
            head = head->next;
            vec.back()->next = pre;
            pre = vec.back();
        
        return pre;
    
;

五、复杂链表的复制

题目

剑指 Offer 35. 复杂链表的复制

解题思路

模拟一遍即可。

AC代码

class Solution

public:
    const int N = 1e5 + 5;
    Node *copyRandomList(Node *head)
    
        vector<Node *> vec;
        for (int i = 0; i < N; i++)
        
            Node *ptr = new Node(1);
            vec.emplace_back(ptr);
        
        int id = 1, cnt = 1;
        map<Node *, int> mp;
        map<int, int> to;
        Node *tmp = head;
        vec[0] = nullptr;
        while (head != nullptr)
        
            mp[head] = cnt++;
            head = head->next;
        
        vec[cnt] = nullptr;
        head = tmp;
        while (head != nullptr)
        
            vec[id]->next = vec[id + 1]; //指向后一个元素
            vec[id]->val = head->val;    //赋值
            // to[i]=j表示i号结点random指向j号结点
            to[id++] = mp[head->random];
            head = head->next;
        
        id = 1;
        while (vec[id] != nullptr)
        
            vec[id]->random = vec[to[id]];
            id++;
        
        return vec[1];
    
;

六、替换空格

题目

剑指 Offer 05. 替换空格

解题思路

AC代码

class Solution

public:
    string replaceSpace(string s)
    
        string ans;
        for (auto it : s)
        
            if (it == ' ')
                ans += "%20";
            else
                ans += it;
        
        return ans;
    
;

七、左旋转字符串

题目

剑指 Offer 58 - II. 左旋转字符串

解题思路

AC代码

class Solution

public:
    string reverseLeftWords(string s, int n)
    
        return s.substr(n) + s.substr(0, n);
    
;

八、数组中重复的数字

题目

剑指 Offer 03. 数组中重复的数字

解题思路

AC代码

class Solution

public:
    int findRepeatNumber(vector<int> &nums)
    
        set<int> st;
        for (auto it : nums)
        
            if (st.count(it))
                return it;
            st.insert(it);
        
        return -1;
    
;

九、I. 在排序数组中查找数字

题目

剑指 Offer 53 - I. 在排序数组中查找数字

解题思路

AC代码

class Solution

public:
    int search(vector<int> &nums, int target)
    
        map<int, int> mp;
        for (auto it : nums)
            mp[it]++;
        return mp[target];
    
;

十、II. 0~n-1中缺失的数字

题目

剑指 Offer 53 - II. 0~n-1中缺失的数字

解题思路

AC代码

class Solution

public:
    int missingNumber(vector<int> &nums)
    

        int ans = 0;
        while (ans < nums.size() && nums[ans] == ans)
            ans++;
        return ans;
    
;

十一、二维数组中的查找

题目

剑指 Offer 04. 二维数组中的查找

解题思路

遍历每一列,采用二分,时间复杂度 O ( n l o g m ) O(nlogm) O(nlogm)
官方题解:从右上角出发,边走边选择,时间复杂度 O ( n l o g m ) O(nlogm) O(nlogm)

AC代码

class Solution

public:
    bool findNumberIn2DArray(vector<vector<int>> &matrix, int target)
    
        if (!matrix.size())
            return 0;
        int n = matrix.size();
        int m = matrix[0].size();
        for (int i = 0; i < n; i++)
        
            int p = lower_bound(matrix[i].begin(), matrix[i].end(), target) - matrix[i].begin();
            if (p != m && matrix[i][p] == target)
                return 1;
        
        return 0;
    
;

十二、旋转数组的最小数字

题目

剑指 Offer 11. 旋转数组的最小数字

解题思路

判断一下转折位置和corner test即可。

AC代码

class Solution

public:
    int minArray(vector<int> &numbers)
    
        int n = numbers.size();
        if (n == 1)
            return numbers[0];
        for (int i = 0; i < n - 1; i++)
            if (numbers[i] > numbers[i + 1])
                return numbers[i + 1];
        return numbers[0];
    
;

十三、第一个只出现一次的字符

题目

剑指 Offer 50. 第一个只出现一次的字符

解题思路

AC代码

class Solution

public:
    char firstUniqChar(string s)
    
        map<char, int> mp;
        for (auto it : s)
            mp[it]++;
        for (auto it : s)
            if (mp[it] == 1)
                return it;
        return ' ';
    
;

十四、I. 从上到下打印二叉树

题目

剑指 Offer 32 - I. 从上到下打印二叉树

解题思路

遍历一遍即可。、
好吧,其实可以直接BFS。

AC代码

cla

以上是关于leetcode剑指offer合集+题解的主要内容,如果未能解决你的问题,请参考以下文章

leetcode剑指offer合集+题解

leetcode剑指offer合集+题解

Leetcode---剑指Offer题14---剪绳子

Leetcode---剑指Offer题14---剪绳子

[LeetCode]剑指 Offer 14- I. 剪绳子

LeetCode(剑指 Offer)- 14- I. 剪绳子