自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 问答 (2)
  • 收藏
  • 关注

原创 LeetCode 342 4的幂[循环 递归 位运算] HERODING的LeetCode之路

解题思路:首先例行使用循环和递归的方式解决该题,代码如下:class Solution {public: bool isPowerOfFour(int n) { if(n < 1) { return false; } if(n == 1) { return true; } if(n % 4 == 0) { return isPowerOf

2021-05-31 00:19:51 93

原创 LeetCode 231 2的幂[循环 递归 位运算] HERODING的LeetCode之路

解题思路:首先想到的就是循环判断是否能被2整除,然后除2不停循环下去,直到大于1(因为1本身就属于2的0次幂),当然还要注意小于等于0的输入,直接返回false即可,代码如下:class Solution {public: bool isPowerOfTwo(int n) { if(n <= 0) { return false; } bool flag = true; while(n > 1)

2021-05-30 08:00:38 153

原创 LeetCode 1074 元素和为目标值的子矩阵数量[动态规划 前缀和 暴力] HERODING的LeetCode之路

解题思路:首先我们得把该数组的前缀和给表示出来,就是i行和j列组合成的矩阵的和是由i-1、j列,i-1、j列,i-1、j-1列的值组成,得到我们想要的前缀和之后,首先用暴力去解决尝试一波,就是对每个i,j分割的矩阵,遍历每一个子矩阵,时间复杂度达到了O(n^2· m^2),代码如下:class Solution {public: int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target)

2021-05-29 08:56:25 156

原创 LeetCode 560 和为K的子数组[哈希表 前缀和] HERODING的LeetCode之路

解题思路:首先看到这题想到的是哈希表+暴力,但是现实总是残酷的,上来直接吃瘪,代码如下:class Solution {public: int subarraySum(vector<int>& nums, int k) { unordered_map<int, int> count; count[k] = 0; int len = nums.size(); for(int i = 0; i <

2021-05-29 08:32:25 161 2

原创 LeetCode 477 汉明距离总和[数学 异或] HERODING的LeetCode之路

解题思路:与汉明距离一题简直就是父子题,当我拿到这道题的时候,直接想着就是调用汉明距离题目里的函数,然后双层for循环即可,代码如下:class Solution {public: int totalHammingDistance(vector<int>& nums) { int sum = 0; int len = nums.size(); for(int i = 0; i < len - 1; i ++) {

2021-05-28 00:30:07 119

原创 LeetCode 461 汉明距离[异或] HERODING的LeetCode之路

解题思路:找对应的二进制位置不相等个数,那么肯定要用到异或的方法,由于int型最多也就32位的二进制,那就从32位开始(也就是正向第一位),一直到最后一位,每一位进行异或,1说明不同,0说明相同,代码如下:class Solution {public: int hammingDistance(int x, int y) { int count = 0; // 32位 int i = 31; while(i --) {

2021-05-27 00:13:23 119

原创 LeetCode 1190 反转每对括号间的子串[栈] HERODING的LeetCode之路

解题思路:遇到字符串有条件变化(遇到括号或者运算符),第一个想到的方法就应该是栈,毕竟栈的方法是基于递归的,而括号也是递归的形式,本题首先定义好栈和空字符串,遇到左括号当前遍历的序列进栈,遇到右括号翻转当前序列并把栈顶出栈,否则就是单纯字符入字符串,仔细推理应该能够找到这样的规律,代码如下:class Solution {public: string reverseParentheses(string s) { // 定义栈和字符串 stack<stri.

2021-05-26 00:26:11 125

原创 LeetCode 1787 使所有区间的异或结果为零[动态规划 哈希表] HERODING的LeetCode之路

解题思路:一道相对复杂的动态规划题目,在解题前还需要找规律,建立参考官方题解进行理解,代码如下:class Solution {private: // x 的范围为 [0, 2^10) static constexpr int MAXX = 1 << 10; // 极大值,为了防止整数溢出选择 INT_MAX / 2 static constexpr int INFTY = INT_MAX / 2; public: int minChang

2021-05-25 08:46:25 130

原创 LeetCode 1091 二进制矩阵中的最短路径问题[BFS 队列] HERODING的LeetCode之路

解题思路:使用广度优先遍历的方法,可以遍历下一步能走的位置,一般用到广度优先就离不开队列,队列存储着当前轮次能够走的位置,每一轮都要将能走的长度++,如果队列无元素,说明无处可走,此时没有到终点就直接返回-1,代码中注释已经很详尽了,按照步骤一步一步看肯定可以看懂。关键就在于如何理解队列与广度优先的配合问题。队列中存储元素的意义问题。以及步长在何时更新。在本题的方法中,不用管走哪条路径最好,就是每轮迭代,迭代到终点位置,那就是最好的路径,代码如下:class Solution {publi

2021-05-24 21:54:47 218

原创 LeetCode 664 奇怪的打印机[动态规划] HERODING的LeetCode之路

解题思路:做动态规划的题目首先就要找规律,这样才能写出状态转移方程。对于字符a,打印1次。字符ab,打印两次。字符aba,打印两次,这是因为aba可以是ab或者ba顺便打印的,这就说明只要是边界相等,可以由子状态推出来。abab需要三次,这是aba的次数加上单独打印b的次数或者bab的次数加上a单独打印的次数。dp[i][j]表示i到j长度打印的次数,状态转移方程也很好构建,如果边界相等,dp[i][j] = dp[i][j - 1],边界不相等则由所有子状态确定,dp[i][j] = mi

2021-05-24 08:17:09 86

原创 LeetCode 96 不同的二叉搜索树[数学 动态规划] HERODING的LeetCode之路

解题思路:使用动态规划的方法需要分析长度为i的二叉搜索树个数的组成,即以1——i为根节点的二叉搜索树个数之和!那么状态转移方程就可以轻松构建了,dp[i] += dp[j - 1] * dp[i - j];代码如下:class Solution {public: int numTrees(int n) { vector<int> dp(n + 1); // 空和单节点情况都是1 dp[0] = 1; dp[1] = 1

2021-05-23 22:39:28 121 1

原创 LeetCode 95 不同的二叉搜索树[分治] HERODING的LeetCode之路

解题思路:一个关于搜索二叉树的分治算法,应该也算是递归的特殊情况了,我们要理清一个思想就是构建好左子树、构建好右子树然后插到root上,其实每个子树也都是这样构建而来的,这也就是分治的真谛,到这一步解题就容易多了。代码注释也很详尽了,代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *

2021-05-23 20:53:58 123

原创 LeetCode 241 为运算表达式设计优先级[分治] HERODING的LeetCode之路

解题思路:一道分治思想的题目,分治的本质就是拆分成最小的部分进行操作,那么在该题中,我们将表达式拆分成一个个独立的运算结果,然后进行运算得到最终的结果,代码如下:class Solution {public: vector<int> diffWaysToCompute(string expression) { // 存储中间值 vector<int> count; for(int i = 0; i < express

2021-05-23 16:38:13 118

原创 LeetCode 1707 与数组中元素的最大异或值[字典树 异或] HERODING的LeetCode之路

解题思路:明显不能用暴力法去解决(很可能超时),最妙的方式是字典树,首先把数组中所有元素放入字典树中,然后遍历查询数组与字典树中小的比较,难点一在于找小于阈值的字典树中的位置,第二个是判断当前数是最小数,为了找小于阈值的位置,我们把查询数组按照第二个元素的大小排序,这样字典树每次只插入不大于该数的数字,如果一个都插不进去,说明阈值数太小,直接返回-1,注释已经很详尽了,关注细节的朋友请看代码,代码如下:class Trie{private: // 0或1 Trie* next[2]

2021-05-23 09:21:41 181

原创 LeetCode 810 黑板异或游戏[数学 异或] HERODING的LeetCode之路

解题思路:困难+异或,下意识想到动态规划,没想到竟然只是纯粹的数学题目,留下了不争气的泪水。。。言归正传,这确实是一道标准的数学题,或者说是推理题目,不能先入为主,给题目带跑偏了,因为你不知道什么才是最优情况,在该题中,可能同时最优情况有数百种,只有一种是错误的选择,所以我们只能分析。首先就是初始值异或结果是0,那么Alice直接获胜,接着考虑奇偶性问题,这就需要数学的推导了,假设 Alice面临失败的状态,则只有一种情况,即无论擦掉哪一个数字,剩余所有数字的异或结果都等于 0,那么这是否成立呢?是

2021-05-22 09:39:41 181 4

原创 LeetCode 34 在排序树组中查找元素的第一个和最后一个位置[二分法] HERODING的LeetCode之路

解题思路:既然要求时间为O(logn),又是有序序列,二分法最适合不过了,首先不断取中间值,一直等到目标值,或者找不到(通过一个find进行判断),然后分别向左向右找到边界即可,代码如下:class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; boo

2021-05-21 12:08:02 89 1

原创 LeetCode 1035 不相交的线[动态规划] HERODING的LeetCode之路

解题思路:老实说,我是没想到这个竟然是最长公共子序列,甚至看到别的评论提到也没想到这个和公共子序列那题一模一样!仔细看题确实能够知道是用动态规划去求解,但是我一直没能获取到的信息就是不交叉的线的序列一定是按照序列排序的,所以才不交叉!代码细节这里就不多赘述了,注释已经很详尽了,代码如下:class Solution {public: int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2)

2021-05-21 09:21:24 127

原创 LeetCode 278 第一个错误的版本[二分法] HERODING的LeetCode之路

解题思路:这道题目难点不在于二分法,因为这里的二分太简单了,就是正常的二分,分割点也就在true和false之间的那个true,本题的难点在于溢出的问题,因为函数输入只能是int型,但是mid如果是相加 / 2会有例子溢出。。。溢出发生在 high + low 这里,所以要避免溢出的发生,要进行一下变形,改成low + (high - low) / 2即可,特别巧妙,代码如下:// The API isBadVersion is defined for you. // bool isBadVersio

2021-05-20 20:09:15 107 1

原创 LeetCode 540 有序数组中的单一元素[二分法 位运算] HERODING的LeetCode之路

解题思路:最近也是练了不少位运算的题目,看到这种只有一个数单着,其他都是成双的,眼睛都放光了,直接全部位运算一波,剩下的就是单着的值了, 毕竟相同的数位运算结果为0,代码如下:class Solution {public: int singleNonDuplicate(vector<int>& nums) { int num = 0; for(int i : nums) num ^= i; return

2021-05-20 19:49:29 125

原创 LeetCode 692 前K个高频单词[自定义排序 Map] HERODING的LeetCode之路

解题思路:统计字符串数目的问题首先想到就是map,但是难点在于怎么排序,因为map内进行排序的话需要构建新的map类,就略显复杂了,可不可以只定义一个排序函数就能够实现排序呢?当然可以!让vector承接map,对于sort来说,可以直接使用自定义的排序函数的,然后在vector中sort,输出前k项即可,代码如下:bool compare(const pair<string, int>& s1, const pair<string, int>& s2) {

2021-05-20 09:14:19 122

原创 LeetCode 744 寻找比目标字母大的最小字母[二分法] HERODING的LeetCode之路

解题思路:首先注意一下限定条件,就是如果序列中最大的字母也不比目标字母大,就返回第一个位置的字母,然后就开始我们的二分法,这次二分法找的是比目标target大的字符,那么如果mid位置小于等于target,left = mid + 1,大于target,right 直接等于 mid,因为说不定此时的 mid 刚好比目标大一点点呢!代码如下:class Solution {public: char nextGreatestLetter(vector<char>& letter

2021-05-19 19:31:21 94

原创 LeetCode 69 x的平方根[二分法] HERODING的LeetCode之路

解题思路:一个特别简单的二分法题目硬是给我整不会了,主要还是边界判断出了问题,首先定义二分的边界0,x,然后取中间值,在判断是否满足条件要用除,不能直接mid * mid,因为如果mid过大会越界,除的话分三种,一种是 x / mid 等于 mid,说明mid不是x的根就是根的整数部分,因为刚好小那么一点,第二种情况是 x / mid 大于 mid,说明 mid 太小了,那么就让下边界往上去一点, low = mid + 1,第三种情况是 x / mid 小于 mid,那就是mid大了, high = m

2021-05-19 19:15:29 116

原创 考研复试 打印日期[华科机考 日期] HERODING的考研之路

解题思路:和清华的今年的第几天如出一辙,只不过是目标反过来,这是已知日子求日期,依旧是准备好闰年的判断函数和前n个月的天数,通过判断出是否闰年决定天数的数组,之后遍历找到总天数刚好超过当前天数的前后两个月的位置,以后一个位置作为当前的月份,代码如下:#include<iostream>using namespace std;int months[2][12] = {{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},

2021-05-19 14:25:33 145

原创 考研复试 今年的第几天[清华复试上机 日期] HERODING的考研之路

解题思路:平时关于日期的练习较少,这次看到这道基础日期题目,就索性做了一下,对于日期的判断,基本都有闰年的判断,4的倍数且不被100整除,或者能被400整除的年份为闰年,2月会多一天,在计算天数时,我首先把所有月份之前的天数全部保存下来,对于2月单独进行判断(当且仅当输入的月份大于2月的情况),这样结果就显而易见了,整体的思路是非常清晰的,代码如下:#include<iostream>using namespace std;int months[12] = {0, 31, 59, 9

2021-05-19 10:51:14 115 1

原创 算法笔记 揭开scanf(“%d“, &a)!=EOF的神秘面纱 HERODING的算法之路

前言许多时候,我们在编程或者参考他人的代码题时,在遇到循环输入的问题常常会见到while(scanf("%d", &a)!=EOF)的使用,这种用法并不少见,前面的while可以理解,循环嘛,那后面的输入到底该如何理解呢?以前也查阅过资料说EOF是end of file,也就是输入不等于文件结束,就可以继续输入,记是记下来了,还是无法理解,在复习这段时间,我又查阅了资料,终于弄明白是怎么一回事了,下面我将详细解释。前提知识点scanf是有返回值的!返回的是被输入函数成功赋值的变量个数。wh

2021-05-19 09:26:31 1929 1

原创 LeetCode 1738 找出第K大的异或坐标值[数组 找规律] HERODING的LeetCode之路

解题思路:本质又是一个找规律题目,需要经过数学推理一波才能够得出结论,如果只是暴力的话,那肯定直接爆炸,时间复杂度都O(n^4)了,通过观察可以发现每一个矩形右下角的值是由该矩形内所有位置异或得到的,如果我们把异或值保存到该位置左,上,左上位置中,那么直接异或这三个数就能得到最后的结果,把值存储到vector中最后排序一波即可找到目的值,代码如下:class Solution {public: int kthLargestValue(vector<vector<int>&gt

2021-05-19 08:44:48 129

原创 算法笔记 排序算法完整介绍及C++代码实现 HERODING的算法之路

数据结构刚好复习到排序部分,排序主要分为三种类型,插入排序、交换排序、选择排序,为了更好理解和记忆,这里我将代码和记录下来,以备遗忘之用,亦可为后人参考~

2021-05-18 19:36:04 237 1

原创 LeetCode 1442 形成两个异或相等数组的三元组数目[异或 位运算 数学] HERODING的LeetCode之路

解题思路:既然a和b相等,且a的异或序列和b的异或序列紧紧相连,那么我们就有理由知道a到b结束的序列的异或结果是0,那么直接子序列的异或值为0的序列即可,那么数量如何统计呢?观察可以发现一串异或值为0的序列,无论分割位置k在哪里,所划分的a和b的异或值都相等,这样结果直接加 (j - i) 即可,代码如下:class Solution {public: int countTriplets(vector<int>& arr) { // 定义长度,数量

2021-05-18 09:38:10 243

原创 LeetCode 993 二叉树的堂兄弟节点[DFS 回溯] HERODING的LeetCode之路

解题思路:对于深度的搜索,即可以用广度优先,也可以使用深度优先,都特别适用这些场合,但是在使用深搜的时候,要注意回溯,因为深度不能是一直往下,在切换左右深度的时候对深度要回到之前的状态,代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), le

2021-05-17 08:46:05 109

原创 LeetCode 421 数组中两个数的最大异或值[前缀树 字典树] HERODING的LeetCode之路

解题思路:看到题目,一时半会没有思路,只好暴力进行,时间O(n²),C++超时,Java勉强过,可能用例太少了吧,仔细想想O(n)可以用哈希表实现,哈希表O(1),但是枚举每个数的二进制数需要O(logn),所以最理想还是O(nlogn)的情况。这里我又新学了一招,基于前缀树的字典树,本质上就是二叉树,或者你可以理解为一种哈弗曼树,自上而下用二进制编码,我们把所有数的二进制存储进字典树中,然后遍历所有的数,在字典树中查找尽量相反的序列,时间复杂度也为O(nlongn),代码如下:class Trie.

2021-05-16 01:55:20 222 1

原创 LeetCode 13 罗马数字转整数[找规律 多条件判断] HERODING的LeetCode之路

解题思路:两种解题方法,第一种就是硬判断,把所有情况都考虑进去,一共十三种条件,怎么说还是有点麻烦的,代码如下:class Solution {public: int romanToInt(string s) { int res = 0; int len = s.length(); for(int i = 0 ; i < len; i ++) { if(s[i] == 'I' && i < le

2021-05-15 08:35:11 74

原创 LeetCode 12 整数转罗马数字[硬编码 数学 找规律] HERODING的LeetCode之路

解题思路:一道非常好的逻辑推理题,可以发现,大的数永远在左边,那么就可以想到一种方法,就是首先把这些字符按照从大到小的方式排序,对要转换的数进行遍历,构建一个字符串,每次减去所能减去最大的字符的值,并让字符串+该字符,直到数组为0,代码如下:const pair<int, string> valueSymbols[] = { {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "..

2021-05-14 20:33:40 93 1

原创 LeetCode 1269 停在原地的方案数[动态规划] HERODING的LeetCode之路

解题思路:一道简单的二维动态规划题目,dp[i][j] 表示还剩i步,当前所处的j位置,所以我们最后返回的是dp[0][0],初始化dp[steps][0] = 1,状态转移方程,即由从上一步的不移动,往左移,往右移组成,最后简单优化一下,对没有意义的运算(0 + 0 = 0)部分直接跳出,代码如下:class Solution {public: int numWays(int steps, int arrLen) { // 定义取模的数,最大边界长度 cons

2021-05-13 14:22:36 75

原创 考研复试 Old_Bill[暴力遍历] HERODING的考研之路

解题思路:也是一道简单的暴力遍历题,需要注意的是题型是英文形式,然后输入的方式是while循环输入,还要注意根据条件从下到大遍历,得到结果记得break,代码如下:#include<iostream>using namespace std;int main() { int n, x, y, z; while(cin >> n) { cin >> x >> y >> z; int tota.

2021-05-12 21:10:22 176

原创 考研复试 与7无关的数[暴力遍历 反序] HERODING的考研之路

解题思路:该题其实没什么好说的,暴力就完事,找到7的倍数或者含有7的数,剔除掉就行,巧妙的地方在于找到7的位数,方法使用的是反序遍历的方法,编写一个反序遍历的函数,如果遇到7就返回true,代码如下:#include<iostream>using namespace std;bool judge(int n) { while(n > 0) { int temp = n % 10; if(temp == 7) { r

2021-05-12 20:32:39 110

原创 考研复试 百鸡问题[暴力遍历] HERODING的考研之路

解题思路:考研刷题系列第一题,中规中矩的暴力题,需要注意的地方是在边界部分,在遍历的时候你可以选择从0——100,这是从数量上遍历,也可以从价格上进行遍历,但是综合来说从数量上更能节省时间,而且更符合目的,二者的代码分别如下:#include<iostream>using namespace std;int main() { int n; cin >> n; for(int i = 0; i <= n / 5; i ++) {// 按照价格遍

2021-05-12 20:28:48 104

原创 LeetCode 1310 子数组异或查询[位运算 异或] HERODING的LeetCode之路

解题思路:既然不能直接计算出所有的异或结果(超时),那么不如存储中间结果,首先把0,01,01^2,。。。这样的异或值存储下来,在遍历queries时直接使用,比如[2,5]就可以用存储的[0,5]与[0,1]异或得到,相信看到这你已经茅塞顿开了,代码如下:class Solution {public: vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& q.

2021-05-12 09:15:25 203 1

原创 LeetCode 1734 解码异或后的排列[数学] HERODING的LeetCode之路

解题思路:仔细分析可以得出,这是一道数学题,不需要设计特别的算法,解决数学题要利用所给的条件,题中的条件有n个正整数的排列,以及加密的实现,依据这两个条件就可以得到perm[0],接下来的数组就轻而易举得到了,代码如下:class Solution {public: vector<int> decode(vector<int>& encoded) { // 定义perm的长度 int n = encoded.size() + 1;

2021-05-11 00:37:39 1126 2

原创 LeetCode 872 叶子相似的树[DFS 二叉树] HERODING的LeetCode之路

解题思路:从左往右找叶子结点判断相等,首选深度优先,用vector存储遍历后的叶子节点,最后进行简单优化下,代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * T

2021-05-10 00:22:07 97

原创 LeetCode 1482[二分法 优化] 制作m束花所需的最少天数 HERODING的LeetCode之路

解题思路:常见的二分法题目,这里二分的是开花的天数,优化在于最小天数和最大天数的定义,如果定义分别为花成熟最早和最晚时间,可以在一定程度上减少用时(官方题解从1开始不是最优情况),注意这里还要编写一个判断当前的限制时间开花的花数能否满足需求的函数,这样代码逻辑更清晰,注释已经很详尽了,代码如下:class Solution {public: int minDays(vector<int>& bloomDay, int m, int k) { int len

2021-05-09 00:32:16 114 2

大连理工大学数据库上机-大学模式数据库.docx

这是大连理工大学大学模式数据库上机的答案,标签已经标注完成,有需要的同学自取,当然答案多样,这里只有一种,希望大家可以在看到答案后有所启发,使用更多的方法。

2020-06-07

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

TA关注的人

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