算法训练营day23

本文介绍了如何处理腾讯面试中的三个技术问题:翻转链表每组k个节点、修剪二叉搜索树保持范围、以及将有序数组转化为平衡二叉搜索树和累加树。涉及链表操作、二叉树遍历和结构转换的细节实现。
摘要由CSDN通过智能技术生成

题目部分

25.K个一组翻转链表

腾讯的面试题,一个比较简单的hard,但是写了两个小时才oc,要注意细节逻辑

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (k == 1)return head;
        ListNode* vh = new ListNode();
        vh->next = head;
        ListNode* pre = vh;
        ListNode* start = head;;
        ListNode* end = head;

        while (1) {
            start = end;
            for (int j = 0; j < k; j++) {
                if (end != nullptr)
                    end = end->next;
                else
                    return vh->next;;
            }
            pair<ListNode*, ListNode*> result = myreverse(start, k);
            pre->next = result.first;
            pre = result.second;
            pre->next = end;
        }
        return vh->next;
    }
    pair<ListNode*, ListNode*> myreverse(ListNode* head, int k) {
        ListNode* cur1 = head;
        ListNode* cur2 = cur1->next;
        ListNode* cur3 = cur2->next;
        ListNode* rear = head;
        for (int i = 1; i < k; i++) {
            cur2->next = cur1;
            cur1 = cur2;
            cur2 = cur3;
            rear = cur1;
            if (cur3)cur3 = cur3->next;
            else {
                if (!cur2) {
                    rear = cur1;
                }
                else {
                    cur2->next = cur1;
                    rear = cur2;
                }
                return { rear, head };
            }
        }
        return { rear, head };
    }
};

669.修剪二叉搜索树

注意不要把满足的子树给丢了就行

class Solution {
public:
    TreeNode* traversal(TreeNode*root, int low, int high){
        if(root==nullptr)return nullptr;
        if(root->val<low){
            return traversal(root->right,low,high);
        }
        if(root->val>high){
            return traversal(root->left,low,high);
        }
        root->left = traversal(root->left,low,high);
        root->right = traversal(root->right,low,high);
        return root;
    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return traversal(root,low,high);
    }
};

108.将有序数组转换为平衡二叉搜索树

自己写的比较冗余,构造了多次数组,不如直接操作下标

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int size = nums.size();
        return traversal(nums,0,size);
    }
    TreeNode* traversal(vector<int>& nums,int left,int right){
        int mid = (left+right)/2;
        if(left>=right)return nullptr;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left =  traversal(nums,left,mid);
        root->right = traversal(nums,mid+1,right);
        return root;
    }
};

538.把二叉搜索树转换为累加树

采用逆中序的方法遍历,用pre存值

class Solution {
public:
    TreeNode* convertBST(TreeNode* root) { 
        traversal(root);
        return root; 
    }
    void traversal(TreeNode* root) {
        if (root == nullptr)return;
        traversal(root->right);
        root->val += pre;
        pre = root->val;
        traversal(root->left);
        return;
    }
private:
    int pre = 0;
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邓俊辉教授是计算机科学与技术领域著名的教育家和研究者。他在清华大学担任教授,并负责计算机算法与理论方向的研究和教学工作。邓俊辉教授是中国计算机学会副理事长、国际著名科技出版社Springer中国系列丛书主编、IEICE China Communications主编、Journal of Internet Technology编委、《数据结构与算法教程》作者等。 在邓俊辉教授的指导下,他办了多次Dijkstra算法训练营,旨在培养学生对于算法学习的兴趣与能力。Dijkstra算法是一种用于图论中求解最短路径问题的经典算法,具有广泛的应用领域,如路由算法、网络规划和GPS导航系统等。在训练营中,邓俊辉教授通过讲解算法的原理和思想,引导学生进行编程实践和案例分析,帮助他们深入理解Dijkstra算法的应用场景与实际解决问题的能力。 邓俊辉教授所组织的Dijkstra算法训练营受到了广大学生的欢迎和积极参与。通过训练营的学习,学生不仅可以掌握Dijkstra算法的具体实现过程,还能了解算法设计的思路和应用的局限性。在训练营中,学生还可以与同学们进行交流和合作,共同解决实际问题,促进彼此的学术成长和人际交往能力的培养。 总之,邓俊辉的Dijkstra算法训练营为学生提供了一个系统、全面学习算法知识的平台,帮助他们培养解决实际问题的能力和思维方式。通过这样的培训,学生不仅能在学术领域取得更好的成绩,还可以为将来的职业发展打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值