自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [C/C++]二叉树基础

二叉树遍历与恢复

2020-07-29 17:11:53 430

原创 [C/C++]背包问题

问题1:0-1背包问题。给定 nnn 个重量为 { w1w_{1}w1​, w2w_{2}w2​,…, wnw_{n}wn​ },价值 { v1v_{1}v1​, v2v_{2}v2​,…, vnv_{n}vn​ }的物品,给定最大载重 CCC 的背包,每件物品最多装一件,要求背包中的物品价值最大。0-1表示每件物品最多使用一次。思路:我们使用 f(i,c)f(i, c)f(i,c) 表示背包的载量为 ccc,装入 iii 个物品时,包内的价值。基于递归的思想,对于f(i,c)f(i, c)f(i

2020-07-25 21:11:06 220

原创 [杂谈]关于leetcode刷题

关于leetcode刷题事件:今天终于把leetcode 探索中的算法面试题汇总这个题库刷完了。采用的方法是,先思考,思考不来就搜答案,再自己写或者看着答案写,每题做完,我都写一篇博客,方便以后重新刷题。感悟:感觉自己好菜,刷这个题跟以前上学做题完全不一样,以前上学做题一般提笔就会有思路,做着做着答案就做出来了。这个是一直没思路,做着做着还一直出错。是不是我不熟练?混日子混了太久,脑子不管用了?emmmmmm总之,还需要多回顾。最近的招聘都开始了,我一直不敢投简历,好烦,好像会了一些东

2020-07-20 23:53:27 149

原创 [LeetCode][C++] LRU缓存机制

LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶:你是

2020-07-20 23:40:49 152

原创 [LeetCode][C++]加油站

加油站在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例 1:输入:gas = [1,2,3,4,5]cost = [3,4,5,1,2]

2020-07-20 23:27:00 247

原创 [LeetCode][C++] Fizz Buzz

Fizz Buzz写一个程序,输出从 1 到 n 数字的字符串表示。如果 n 是3的倍数,输出“Fizz”;如果 n 是5的倍数,输出“Buzz”;如果 n 同时是3和5的倍数,输出 “FizzBuzz”。示例:n = 15,返回:[“1”,“2”,“Fizz”,“4”,“Buzz”,“Fizz”,“7”,“8”,“Fizz”,“Buzz”,“11”,“Fizz”,“13”,“14”,“FizzBuzz”]思路:遍历每个数字,判断是3、5的倍数,按规

2020-07-20 23:07:02 148

转载 [LeetCode][C++] 两整数之和

两整数之和不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。示例 1:输入: a = 1, b = 2输出: 3示例 2:输入: a = -2, b = 3输出: 1思路:这种看起来基础又很奇怪的题我一般先想到位运算,但是具体怎么运算,我不懂,于是参考别人的博客,链接1写的挺有道理,直接copy。。在位运算操作中,异或的一个重要特性是无进位加法。a = 5 = 0101b = 4 = 0100a ^ b 如下:0 1 0 10

2020-07-20 23:02:32 712

原创 [LeetCode][C++]快乐数

快乐数编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1思路:使用unordere

2020-07-20 22:52:19 348

原创 [LeetCode][C++]3的幂

3的幂给定一个整数,写一个函数来判断它是否是 3 的幂次方。示例 1:输入: 27输出: true示例 2:输入: 0输出: false示例 3:输入: 9输出: true示例 4:输入: 45输出: false进阶:你能不使用循环或者递归来完成本题吗?思路:先的出在类型内最大的3的幂。然后判断能不能被n整除。代码:class Solution {public: bool isPowerOfThree(int n) {

2020-07-20 00:48:03 321

原创 [LeetCode][C++]缺失数字

缺失数字给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例 2:输入: [9,6,4,2,3,5,7,0,1]输出: 8说明:你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?思路:我们将每个数字 i 填到对应的nums[ i ] 上,具体如下:遍历序列,初始化n的位置索引-1,认为其不存在。若元素nums[ i ] 等于n,则记录n的当前位置索引 i。若元素n

2020-07-20 00:41:47 484

原创 [LeetCode][C++]计数质数

计数质数统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。思路:强调一下,1既不是质数,也不是合数。对于2,3这样的质数,我们将其倍数标记为不是质数。剩下的就都是质数了。埃拉托斯特尼筛法,自己百度。代码:class Solution {public: int countPrimes(int n) { int count=0; //1不

2020-07-20 00:31:25 464

原创 [LeetCode][C++]位1的个数

位1的个数编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 00000000000000000000000010000000 中,

2020-07-20 00:25:02 195

原创 [LeetCode][C++]颠倒二进制位

颠倒二进制位颠倒给定的 32 位无符号整数的二进制位。示例 1:输入: 00000010100101000001111010011100输出: 00111001011110000010100101000000解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。示例 2:输入:1111111111111111

2020-07-20 00:20:11 454

原创 [LeetCode][C++]阶乘后的零

阶乘后的零给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。思路:末尾要增加0,的有因子10;因子10可以是 25,10 来的,总之大家就得出结论,25, 10都和5有关,只需要统计5个数目。另外还有25,125…这样的数字,有多个因子5,等价于 n/25, n/125。因此就有

2020-07-20 00:13:58 299

原创 [LeetCode][C++]分数到小数

分数到小数给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。示例 1:输入: numerator = 1, denominator = 2输出: “0.5”示例 2:输入: numerator = 2, denominator = 1输出: “2”示例 3:输入: numerator = 2, denominator = 3输出: “0.(6)”思路:首先判断除数是否是0

2020-07-19 20:07:03 231

原创 [LeetCode][C++]直线上最多的点数

直线上最多的点数给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。示例 1:输入: [[1,1],[2,2],[3,3]]输出: 3解释:^|| \quad \quad o| \quad o| o±------------>0 1 2 3 4示例 2:输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]输出: 4解释:^|| o| \quad o \quad

2020-07-19 19:53:52 480

原创 [LeetCode][C++]课程表 II

课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]]输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为

2020-07-17 23:06:39 243

转载 [LeetCode][C++]课程表

课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: false

2020-07-17 22:59:50 574

原创 [LeetCode][C++]岛屿数量

岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:[[‘1’,‘1’,‘1’,‘1’,‘0’],[‘1’,‘1’,‘0’,‘1’,‘0’],[‘1’,‘1’,‘0’,‘0’,‘0’],[‘0’,‘0’,‘0’,‘0’,‘0’]]输出: 1示例 2:输入:[[‘1’,‘1’,‘0’,‘0’,‘0’],

2020-07-17 22:30:28 705

原创 [LeetCode][C++]单词接龙

单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,endWor

2020-07-17 22:22:12 890

原创 [LeetCode][C++]矩阵中的最长递增路径

矩阵中的最长递增路径给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums =[[9,9,4],[6,6,8],[2,1,1]]输出: 4解释: 最长递增路径为 [1, 2, 6, 9]。示例 2:输入: nums =[[3,4,5],[3,2,6],[2,2,1]]输出: 4解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方

2020-07-16 23:38:08 933

原创 [LeetCode][C++]零钱兑换

零钱兑换给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1说明:你可以认为每种硬币的数量是无限的。思路:背包问题。设dp[amount +1]=amount +1 。初

2020-07-16 23:13:45 637

原创 [LeetCode][C++]最长上升子序列/最大子序和

最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?思路:采用动态规划,设dp[i]是以元素nums[i]结尾的最长升序列长度。初始化最长序列长度max_lengt

2020-07-16 23:01:39 587

原创 [LeetCode][C++]每日温度

每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。思路:我们使用1个最小栈来记录需

2020-07-16 01:31:00 786

原创 [LeetCode][C++]两个数组的交集 II

两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2 小很多,哪种方法更

2020-07-16 00:44:37 186

原创 [LeetCode][C++]递增的三元子序列

递增的三元子序列给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。示例 1:输入: [1,2,3,4,5]输出: true示例 2:输入: [5,4,3,2,1]输出: fal

2020-07-16 00:23:41 269

转载 [LeetCode][C++]实现 Trie (前缀树)

实现 Trie (前缀树)实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app”); // 返回 truetrie.insert(“app”);trie.search

2020-07-15 23:37:32 299

原创 [LeetCode][C++]完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路:对于任意正整数,其拆分的完全平凡数为1,2,3,4。这似乎是一个定理。Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。状态转移方程是dp[i]=min(dp[i

2020-07-15 23:19:31 637

原创 [LeetCode][C++] 打家劫舍

打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7

2020-07-15 23:12:19 326

原创 [LeetCode][C++]最长连续序列

最长连续序列给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。思路:使用unordered_set记录数组中出现的数字。其时间复杂度为O(n),空间复杂度O(1)。初始化最长序列长度max_length=0。遍历数组:(1)若nums[i]-1不存在,则进行下一步的继续搜寻。这是为了防止重复搜索了某一段最长连续序列的子

2020-07-15 22:44:32 546

原创 [LeetCode][C++]二叉树中的最大路径和

二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \15 7输出: 42思路:假设某个点为根节点,其也为迭代的点,此时的路径和为ret,递归函数fff。递归

2020-07-15 22:31:30 757

原创 [LeetCode][C++]至少有K个重复字符的最长子串

至少有K个重复字符的最长子串找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。示例 1:输入:s = “aaabb”, k = 3输出:3最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。示例 2:输入:s = “ababbc”, k = 2输出:5最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。思路:首先统计字符串中每个字符出现的次数,使用数组count[26]

2020-07-15 22:12:59 996

原创 [C/C++]C++多线程入门实例讲解

题目:三个线程,两个线程分别生成一个随机数,第三个线程计算和。思路:熟悉C++多线程的用法以及互斥锁的使用。设置微秒级别的随机数种子。不然产生的两个随机数一样。代码:#include<iostream>#include<windows.h>#include<sys/timeb.h> #include<thread>#include<mutex>using namespace std;int a, b; //

2020-07-15 12:47:20 216

原创 [LeetCode][C++]计算右侧小于当前元素的个数

计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入:[5,2,6,1]输出:[2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1)2 的右侧仅有 1 个更小的元素 (1)6 的右侧有 1 个更小的元素 (1)1 的右侧有 0 个更小的元素思路:(思路以及代码都是参考链接1的)使用二叉排序树,把问题转换

2020-07-15 12:34:21 429

原创 [LeetCode][C++] 寻找重复数

寻找重复数给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。思路:(思路以及代码都是参考链接的)二分

2020-07-15 12:29:12 773

原创 [LeetCode][C++] 寻找峰值

寻找峰值峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入: nums = [1,2,1,3,5,6,4]输出: 1 或 5解释: 你的函数可以返回

2020-07-15 12:17:56 855

转载 [C/C++]Linux多线程入门实例讲解

介绍Linux系统下,利用C/C++多线程的编写。1 创建线程#include<pthread.h>int pthread_create( pthread_t *restrict thread, /*线程id*/ const pthread_attr_t *restrict attr, /*线程属性,默认可置为NULL,表示线程属性取缺省值*/ void *(*start_routine)(void*), /*线程入口函数*/ void *restrict a

2020-07-12 21:22:04 136

转载 [C/C++]Windows多线程入门实例讲解

介绍windows系统下,利用C/C++多线程的编写。1 创建线程HANDLE CreateThread( //windows创建线程的API函数LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULLSIZE_T dwStackSize,//initialstacksize:新线程的初始化栈的大小,可设置为0LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction:被线程

2020-07-12 21:00:58 774

原创 [LeetCode][C++]摆动排序 II

摆动排序 II给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。示例 1:输入: nums = [1, 5, 1, 1, 6, 4]输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]示例 2:输入: nums = [1, 3, 2, 2, 3, 1]输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]说明:你可以假设所有输入都会得到有效的结果。进阶:你能用 O(n)

2020-07-12 01:35:24 204

原创 [LeetCode][C++]最大数

最大数给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例 2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。思路:可以创建一个大顶堆,对每个两个数的组合进行排序,大的排前面,自定义比较函数。对大顶堆进行遍历,逐元素拼接到字符串上。注意:若数组为空,则返回空字符串。数组由一连串0,则返回“0”,而非“000…”。不允许将数组元素按位拆开,每个

2020-07-12 01:17:51 607

空空如也

空空如也

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

TA关注的人

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