481-82(105、24、82、34、153)

105. 从前序与中序遍历序列构造二叉树

在这里插入图片描述

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (!preorder.size()) return nullptr;//如果是一颗空树,直接返回空

        TreeNode* root = new TreeNode;//申请节点并初始化
        root->val = preorder[0];
        root->left = nullptr;
        root->right = nullptr;

        if (preorder.size() == 1)    return root;//如果这课树只有根节点,直接返回这个节点

        //查找当前节点在中序序列中的位置
        auto it = find(inorder.begin(), inorder.end(), preorder[0]);

        //创建左子树前序序列, 右子树前序序列,左子树中序序列, 右子树中序序列
        vector<int> pl(preorder.begin() + 1, preorder.begin() + 1 + (it - inorder.begin()));
        vector<int> pr(preorder.begin() + 1 + (it - inorder.begin()), preorder.end());
        vector<int> il(inorder.begin(), it);
        vector<int> ir(it + 1, inorder.end());

        //创建左右子树, 并将它们的根节点赋值给当前节点的指针
        root->left = buildTree(pl, il);
        root->right = buildTree(pr, ir);

        //返回当前节点
        return root;
    }
};

在这里插入图片描述

24. 两两交换链表中的节点

在这里插入图片描述

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy_node = new ListNode(0);
        dummy_node->next = head;
        ListNode* cur = dummy_node;

        while (cur->next != nullptr && cur->next->next != nullptr)
        {
            ListNode* temp1 = cur->next;
            ListNode* temp2 = cur->next->next->next;

            cur->next = cur->next->next;
            cur->next->next = temp1;
            cur->next->next->next = temp2;

            cur = cur->next->next;
        }
        return dummy_node->next;
    }
};

在这里插入图片描述

82. 删除排序链表中的重复元素 II

在这里插入图片描述

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* dummy_node = new ListNode(0);
        dummy_node->next = head;

        ListNode* cur = dummy_node;

        while (cur->next && cur->next->next)
        {
            if (cur->next->val == cur->next->next->val)
            {
                int n = cur->next->val;
                while (cur->next && cur->next->val == n)
                {
                    cur->next = cur->next->next;
                }
            }
            else
            {
                cur = cur->next;
            }
        }
        return dummy_node->next;
    }
};

34. 在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {

        int left = 0, right = nums.size() - 1;
        vector<int> res;

        while (left <= right)
        {
            int mid = left + ((right - left) >> 1);

            if (nums[mid] > target)  right = mid - 1;
            else if (nums[mid] < target) left = mid + 1;
            else
            {
                int m = mid, n = mid;
                int temp = nums[mid];
                while (m >= 0 && nums[m] == temp)
                {
                    m--;
                }
                res.push_back(m+1);

                while (n < nums.size() && nums[n] == temp)
                {
                    n++;
                }
                res.push_back(n - 1);
                break;
            }
        }
        if(res.size() == 0)   return {-1,-1};
        else    return res;
    }
};

153. 寻找旋转排序数组中的最小值

在这里插入图片描述

class Solution {
public:
    int findMin(vector<int>& nums) {

        int left = 0, right = nums.size() - 1;

        while (left < right)
        {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] > nums[right])
            {
                left = mid + 1;
            }
            else
            {
                right = mid;
            }
        }
        return nums[left];
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值