当前位置: 首页 > news >正文

41.日常算法

1.面试题 02.04. 分割链表

题目来源
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。

示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

方法一——模拟

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if (head == nullptr) return nullptr;
        ListNode* minx = new ListNode;
        ListNode* maxx = new ListNode;
        ListNode* cur = head;
        ListNode* curmin = minx;
        ListNode* curmax = maxx;
        while (cur){
            if (cur->val < x){
                curmin->next = cur;
                curmin = curmin->next;
            }else{
                curmax->next = cur;
                curmax = curmax->next;
            }
            cur = cur->next;
        }
        curmin->next = nullptr;
        curmax->next = nullptr;

        curmin->next = maxx->next;
        return minx->next;

    }
};

方法二——双指针+交换

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* left = head;
        ListNode* right = head;
        while (right){
            if (right->val < x){
                std::swap(left->val, right->val);
                left = left->next;
            }
            right = right->next;
        }
        return head;
    }
};

2.将有序数组转换为二叉搜索树

题目来源
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode * createBTree(TreeNode *&root, vector<int>& nums, int left, int right){
        if (left > right) return nullptr;
        int mid = (right - left) / 2 + left;
        root = new TreeNode(nums[mid]);
        root->left = createBTree(root->left, nums, left, mid - 1);
        root->right = createBTree(root->right, nums, mid + 1, right);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = nullptr;
        createBTree(root, nums, 0, nums.size() - 1);
        return root;
    }
};

相关文章:

  • 介绍两本学习智谱大模型的入门图书
  • Java小白入门基础知识(二)
  • 晶闸管主要参数分析与损耗计算
  • JavaScript 内置对象-日期对象
  • Ubuntu 系统 LVM 逻辑卷扩容教程
  • Hive之分区表
  • 【大模型系列】Windows系统上运行大语言模型方式
  • SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
  • HCIA项目实践(网络)---NAT地址转化技术
  • frp-tool,客户端frp命令行工具
  • 【苍穹外卖】学习
  • LeetCode 1299.将每个元素替换为右侧最大元素:倒序遍历,维护最大值,原地修改
  • WPS的AI助手进化跟踪(灵犀+插件)
  • 【NLP251】BertTokenizer 的全部 API 及 使用案例
  • shell脚本备份mysql数据库和库下表
  • 算法刷题--哈希表--字母异位词和两个数组的交集
  • linux运行kettle 遇到问题汇总
  • 【区块链】零知识证明基础概念详解
  • WebMvcConfigurer 介绍
  • 【硬核对比】C语言 vs MATLAB:从内存管理到矩阵运算的降维打击
  • 狄威已任国铁集团副总经理
  • 巴西外长维埃拉:国际形势日益复杂,金砖国家必须发挥核心作用
  • 匈牙利国会通过退出国际刑事法院的决定
  • 何立峰出席驻沪中央金融机构支持上海建设国际金融中心座谈会并讲话
  • 总书记考察的上海“模速空间”,是一个怎样的空间?
  • 癌症来临前,可能伪装成这几种常见病,千万别大意