自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 编程训练第八十八期—— 二叉搜索树中的众数

编程问题:给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树示例:输入:[1,null,2,2]输出:[2]解法:1.遍历(前中后都可)+ 哈希表当作一般二叉树来处理,没有用到BST的中序遍历是非递减序列的性质。我们可以先通过递归遍历一遍BST,用哈希表存储每个结点值出现的次数。通过一次循环获得

2021-03-31 01:18:02 102

原创 编程训练第八十七期——二叉树的中序遍历

编程问题:给定一个二叉树的根节点 root ,返回它的 中序 遍历。问题描述:输入:root = [1,null,2,3]输出:[1,3,2]输入:root = []输出:[]输入:root = [1]输出:[1]解法:1.递归时间复杂度O(N)空间复杂度O(N)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *

2021-03-31 00:14:15 170

原创 编程训练第八十六期——二叉树的垂序遍历

编程题目:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。返回二叉树的 垂序遍历 序列。示例:输入:root

2021-03-30 00:56:35 128

原创 编程训练第八十五期——后继者

编程问题:设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。问题描述:输入:root = [2,1,3], p = 1输出:输出: 2输入:root = [5,3,6,2,4,null,null,1], p = 6输出:null解法:1.递归如果结点 p 的值大于等于 root 的值,说明 p 的后继结点在 root 右子树中,那么就递归到右子树中查找。如果结点 p 的值小于 root 的值,说明 p 在

2021-03-29 01:57:17 54

原创 编程训练第八十四期——二叉树中所有距离为 K 的结点

编程训练:给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。示例:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1。解法:1.DFS+BFS首先使用 DFS 遍历二叉树,为每个节点保

2021-03-29 00:36:54 131

原创 编程训练第八十三期——翻转二叉树以匹配先序遍历

编程问题:给你一棵二叉树的根节点 root ,树中有 n 个节点,每个节点都有一个不同于其他节点且处于 1 到 n 之间的值。另给你一个由 n 个值组成的行程序列 voyage ,表示 预期 的二叉树 先序遍历 结果。请翻转 最少 的树中节点,使二叉树的 先序遍历 与预期的遍历行程 voyage 相匹配 。 如果可以,则返回 翻转的 所有节点的值的列表。你可以按任何顺序返回答案。如果不能,则返回列表 [-1]。示例:输入:root = [1,2], voyage = [2,1]输出:[-1]解

2021-03-28 23:46:11 214

原创 Linux基于QT的局域网多线程数据传输系统(客户端+服务器)

Linux基于QT的局域网多线程数据传输系统(客户端+服务器):       在进行数据传输的过程中可以选择TCP或者UDP协议,TCP虽然相对而言比较复杂,具有三次握手进行连接以及四次分手断开连接,但具备可靠性,被大公司广泛使用,因此设计一种基于TCP的多线程数据传输系统来进行通信客户端:1)登陆注册功能:点击账号登录,输入账号以及密码,与Mysql数据库中保存的账号信息进行校验,完成登录;点击账号注册,输入账号、密码、重复输入

2021-03-28 01:04:24 1022 1

原创 编程训练第八十二期——二叉树最大宽度

编程问题:给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例:输入:[1,3,2,5,3,null,9]输出:4输入:[1,3,null,5,3]输出:2解法:1.层次遍历建立一个queue队列,按层次遍历向队列插入数据,数据包含结点以及位置position信息。如

2021-03-27 14:22:18 153

原创 编程训练第八十一期——二叉树的直径

编程问题:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。问题描述:输入:[1,2,3,4,5]输出:3解法:1.深度优先遍历时间复杂度O(N)空间复杂度O(N),取决于树的高度,最坏情况下,树形成链状,空间复杂度为 O(N)。/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tr

2021-03-27 12:30:03 113

原创 编程训练第五十四期——不同路径

编程问题:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例:输入:m = 3, n = 7输出:28输入:m = 3, n = 2输出:3输入:m = 7, n = 3输出:28输入:m = 3, n = 3输出:6解法:1.递归时间复杂度O(2^(m+n))空间复杂度O(1)class Solut

2021-03-26 20:36:31 99

原创 编程训练第八十期——翻转二叉树

编程问题:翻转一棵二叉树。示例:输入:[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]解法:1.递归显然,我们从根节点开始,递归地对树进行遍历,并从叶子结点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以root 为根节点的整棵子树的翻转。时间复杂度O(N)空间复杂度O(N),使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。在平均情况下,二叉树的高度与节点个数为对数关系,即 O(log

2021-03-26 20:35:52 164

原创 编程训练第七十九期——对称二叉树

编程问题:给定一个二叉树,检查它是否是镜像对称的。示例:输入:[1,2,2,3,4,4,3]输出:true输入:[1,2,2,null,3,null,3]输出:false解法:1.递归该问题可以转化为——判断两个树互为镜像如果同时满足它们的两个根结点具有相同的值并且每个树的右子树都与另一个树的左子树镜像对称。通过同步移动两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相

2021-03-26 19:48:52 119

原创 编程训练第七十八期——二叉树中和为某一值的路径

编程问题:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。问题描述:输入:[5,4,8,11,null,13,4,7,2,null,null,5,1] 22输出 :[[5,4,11,2],[5,8,4,5]]解法:1.回溯时间复杂度O(N),N 为二叉树的节点数,先序遍历需要遍历所有节点。空间复杂度O(N),最差情况下,即树退化为链表时,temp 存储所有树节点,使用 O(N) 额外空间。/**

2021-03-26 17:24:23 95

原创 编程训练第七十七期——二叉树的深度

编程问题:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3解法:1.DFS时间复杂度O(N),N 为树的节点数量,计算树的深度需要遍历所有节点。空间复杂度O(N),最差情况下(当树退化为链表时),递归深度可达到 N 。/** * Definition for a binary tree node. * struct

2021-03-26 14:53:49 184

原创 编程训练第七十六期——回文链表

编程问题:请判断一个链表是否为回文链表。示例:输入: 1->2输出: false输入: 1->2->2->1输出: true解法:1.线性表时间复杂度O(N)空间复杂度O(N)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullpt

2021-03-26 01:40:58 115

原创 编程训练第七十五期——排序链表

编程问题:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。示例:输入:head = [4,2,1,3]输出:[1,2,3,4]输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]输入:head = []输出:[]解法:1.线性表+排序(快排)时间复杂度O(NlogN)空间复杂度O(N)/** * Definition for singly-linked list. * struct ListNode { * in

2021-03-25 21:28:58 249

原创 编程训练第七十四期——重排链表

编程问题:给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定链表 1->2->3->4, 重新排列为 1->4->2->3.给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.解法:1.线性表时间复杂度O(N)空间复杂度O(N)/

2021-03-25 15:35:00 130

原创 编程训练第七十三期——链表的中间结点

编程问题:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例:输入:[1,2,3,4,5]输出:此列表中的结点 3输入:[1,2,3,4,5,6]输出:此列表中的结点 4解法:1.线性表时间复杂度O(N)空间复杂度O(N)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;

2021-03-25 14:41:59 107

原创 编程训练第七十一期——环形链表

编程问题:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环

2021-03-24 17:05:25 231

原创 编程训练第七十期——反转链表 II

编程问题:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]输入:head = [5], left = 1, right = 1输出:[5]解法:1.迭代反转时间复杂度O(N)空间复杂度O(1)/** * Definit

2021-03-24 16:01:17 220

原创 编程训练第六十九期——反转链表

编程问题:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解法:1.迭代头插时间复杂度O(N)空间复杂度O(1)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : va

2021-03-24 11:06:05 112

原创 编程训练第六十八期——分隔链表

编程问题:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。示例:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]输入:head = [2,1], x = 2输出:[1,2]解法:1.尾插+头插维护一个链表h,分别用两个指针p1,p2来指向尾插和头插的前一个位置,当当前head指向的元素的值小于x则使用头插

2021-03-24 00:50:43 125

原创 编程训练第六十七期——删除排序链表中的重复元素 II

编程训练:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例:输入: 1->2->3->3->4->4->5输出: 1->2->5输入: 1->1->1->2->3输出: 2->3解法:1.双指针时间复杂度O(N)空间复杂度O(1)/** * Definition for singly-linked list. * struct ListNode { *

2021-03-23 17:06:34 162

原创 编程训练第六十六期——删除排序链表中的重复元素

编程问题:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。问题描述:输入: 1->1->2输出: 1->2输入: 1->1->2->3->3输出: 1->2->3原因分析:1.遍历时间复杂度O(N)空间复杂度O(1)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *nex

2021-03-23 14:03:42 126

原创 编程训练第六十五期——合并两个有序链表

编程问题:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]输入:l1 = [], l2 = []输出:[]解法:1.遍历时间复杂度O(M+N),其中 M 和 N 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数

2021-03-23 10:54:40 133

原创 编程训练第六十四期——存在重复元素 II

编程问题:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。示例:输入: nums = [1,2,3,1], k = 3输出: true输入: nums = [1,0,1,1], k = 1输出: true输入: nums = [1,2,3,1,2,3], k = 2输出: false解法:1.哈希表维护一个哈希表,里面始终最多包含 k 个元素,当出现重复值时

2021-03-23 00:54:25 148

原创 编程训练第六十三期——存在重复元素

编程问题:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例:输入: [1,2,3,1]输出: true输入: [1,2,3,4]输出: false输入: [1,1,1,3,3,4,3,2,4,2]输出: true解法:1.排序+一次遍历时间复杂度O(NlogN)空间复杂度O(logN),注意我们在这里应当考虑递归调用栈的深度class Solution {public:

2021-03-23 00:23:57 196

原创 编程训练第六十二期——外观数列

编程问题:给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。示例:111211211111221第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”描述前一项,这个数是 1211 即 “ 一

2021-03-22 21:21:23 148

原创 编程训练第六十一期—— 杨辉三角 II

编程题目:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]解法:1.两次遍历注意到对第 i+1 行的计算仅用到了第 i 行的数据,因此可以使用滚动数组的思想优化空间复杂度。时间复杂度O(N^2)空间复杂度O(N)class Solution {public: vector<int> getRow(int rowIndex) { vec

2021-03-22 01:29:06 143

原创 编程训练第六十期——杨辉三角

编程问题:给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[    [1],    [1,1],    [1,2,1],    [1,3,3,1],    [1,4,6,4,1]]解法:

2021-03-22 00:25:30 119

原创 编程训练第五十九期——买卖股票的最佳时机 II

编程问题:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。问题描述:输入: [7,1,5,3,6,4]输出: 7输入: [1,2,3,4,5]输出: 4输入: [7,6,4,3,1]输出: 0解法:1.一次遍历由于股票的购买没有限制,因此整个问题等价于寻找 x 个不相交的区间 (l,r],使得累积收益最大化

2021-03-21 18:55:34 227

原创 编程训练第五十七期——单词搜索

编程问题:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board = [    [‘A’,‘B’,‘C’,‘E’],    [‘S’,‘F’,‘C’,‘S’],    [‘A’,‘D’,‘E’,‘E’]]给定

2021-03-21 00:18:24 212

原创 编程训练第五十六期—找到所有数组中消失的数字

编程问题:给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。解法:class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums

2021-03-20 01:42:43 120

原创 编程训练第五十三期——汇总区间

编程问题:给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:“a->b” ,如果 a != b“a” ,如果 a == b示例:输入:nums = [0,1,2,4,5,7]输出:[“0->2”,“4->5”,“7”]解释:区间范围是:[0,2]

2021-03-19 00:52:57 103

原创 编程训练第五十二期——无重叠区间

编程问题:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。示例:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。输入: [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。输入: [ [1,2], [2,3] ]输出: 0解释: 你不需要移除任何区间,因为它们已经是无重叠的了。解法:1.排序+贪心+双指针时间复

2021-03-18 20:59:26 169

原创 编程训练第五十一期——插入区间

编程问题:给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]输出:[[1,2],[3,10],[12,16]]解释:

2021-03-18 20:17:12 117

原创 编程训练第五十期——合并区间

编程题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输入:intervals = [[1,4],[4,5]]

2021-03-18 17:22:44 553

原创 编程训练第四十九期——跳跃游戏

编程问题:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

2021-03-18 15:49:04 400

原创 编程训练第四十八期——旋转图像

编程问题:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14

2021-03-18 15:15:05 215

原创 编程训练第四十七期——合并两个有序数组

编程问题:给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]输入:nums1 = [1], m = 1

2021-03-18 01:09:01 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除