
算法
yxh_1_
这个作者很懒,什么都没留下…
展开
-
LeetCode题解——汉明距离总和
LeetCode题解——汉明距离总和题目介绍解题思路这题是https://blog.youkuaiyun.com/yxh_1_/article/details/117331121?spm=1001.2014.3001.5501的一个升级版 第一种暴力解法,将num数组进行双重循环,将两两带入到之前的弱版接口获取不同位数的和,但这种方法会超时 第二种方式,我们将循环的目标放到每一位上,算出num数组里面第一位为1的元素数量n,那么为0的就是len-n 那么光第一位上不同的情况就有n*(len-n)依次在原创 2021-05-28 20:10:38 · 232 阅读 · 0 评论 -
LeetCode题解——汉明距离
LeetCode题解——汉明距离题目介绍解题思路这题的思路就是找到两个数二进制位不相同的个数 我们可以很容易用x^y的结果来表示二进制位不相同的情况,因为^的作用是相同为0,不相同为1 那么异或的结果里面有多少个1,就有多少不相同的个数代码示例class Solution {public: int hammingDistance(int x, int y) { int tag = x^y; int res = 0; while(原创 2021-05-27 16:05:42 · 251 阅读 · 0 评论 -
LeetCode题解——使所有区间的异或结果为零
LeetCode题解——使所有区间的异或结果为零题目介绍解题思路首先由题可知nums数组里面任何相连的k个数它的异或结果为0 那么可以得到[0,k)区间即nums[i]^nums[i+1]^...^nums[i+k-1] = 0 同理nums[i+1]^nums[i+2]^...^nums[i+k] = 0,将两个相同的部分消掉,那么我们可以得出一个结论nums[i] = nums[i+k] 那么我们可以得出我们最后要得到的是一个什么样的数组,就是以k为一个循环的数组,且每个循环的异或为0原创 2021-05-26 20:58:09 · 806 阅读 · 0 评论 -
LeetCode题解——反转每对括号间的子串
LeetCode题解——反转每对括号间的子串题目介绍解题思路这题的只要思路就是找到最里一层的括号,然后做两件事,将括号里面的内容翻转,将括号去除 现在关键就是如何能找到最里一层的括号,第一个出现的‘)’那么配上它前面的'('肯定就是最里面的一层括号了 现在就是有序的记录‘(’的位置,要保证先进后出,确保第一个取出来的是里层的括号,可以用栈来存放代码示例class Solution {public: string reverseParentheses(string s) {原创 2021-05-26 20:10:28 · 210 阅读 · 0 评论 -
LeetCode题解——与数组中元素的最大异或值
LeetCode题解——与数组中元素的最大异或值题目介绍解题思路这题的解题思路路和LeetCode题解——数组中两个数的最大异或值_yxh_1_的博客-优快云博客基本一致,区别在于多了限制值,找到的值要小于limit第一种暴力解法,双重循环时间复杂度O(n*m),但是可能会超时 第二种字典树,我们先要知道一点,异或就是相同为0,否则为1,那么我们随机给出一个数nums[i]怎么让它的异或结果最大呢,是不是要选择一个和num[i]二进制位数基本相反的,就是你是1,那我就选0 比如nums原创 2021-05-23 13:57:26 · 467 阅读 · 1 评论 -
LeetCode题解——Z 字形变换
LeetCode题解——Z 字形变换题目介绍解题思路这题的本质就是将s遍历,然后将字符进行分配,依次为0,1,2,3,...numRows-1,numRows-2....2,1,0 其实就是以2(numRows-1)为一个循环 当i%2(numRows-1)的余数index,小于等于numRows-1,index代表分配给哪一行 当i%2(numRows-1)的余数index,大于numRows-1,代表字符分配给2(numRows-1) -index行 最后将每行的数据合在一起就是需要原创 2021-05-22 16:40:16 · 151 阅读 · 0 评论 -
LeetCode题解——黑板异或游戏
LeetCode题解——黑板异或游戏题目介绍解题思路这题其实只要找对获胜条件,算法实现本身并不难 alice要获胜只有2种可能,第一种她不是最后一个把数字擦掉的人,换句话说就是她擦掉了倒数第二个数 第二种可能轮到alice的回合,剩余的数字正好异或结果为0 先看第一种可能,由于Alice先手,也就意味着数组的长度要为偶数,这样Alice才不会成为最后一个擦掉数字的人 第二种可能,由于题目告诉了我买每个玩家都使用最优解,也就是说双方都不可能会出现擦掉一个数字剩下的数字异或为0,让对方获胜的原创 2021-05-22 11:32:42 · 205 阅读 · 0 评论 -
LeetCode题解——寻找两个正序数组的中位数
LeetCode题解——寻找两个正序数组的中位数题目介绍解题思路这题首先我们需要先合并两个数组,由题可知数组是已经排完序的 所以我们直接可以用归并操作了 然后找到排序后数组的中位数,如果长度为偶,就(res[mid]+res[mid-1])/2,如果为奇数,那就是res[mid]代码示例class Solution {public: void merge(vector<int>& res, vector<int>& nums1, vec原创 2021-05-21 22:10:44 · 128 阅读 · 0 评论 -
LeetCode题解——无重复字符的最长子串
LeetCode题解——无重复字符的最长子串题目介绍解题思路这题考察的是滑动窗口的知识点 拿例子来说首先a为起点,(abc)abcbb,abc就是当前的一个窗口 然后将窗口右滑,a(bca)bcbb,依次将括号向右移动,逐步找到最大的不重复子串代码示例class Solution {public: int lengthOfLongestSubstring(string s) { int len = s.size(); unordered_set原创 2021-05-21 19:44:51 · 122 阅读 · 0 评论 -
LeetCode题解——不相交的线
LeetCode题解——不相交的线题目介绍解题思路其实只要看懂这个题目的2点本质,可以将这题目转换成两个数组的最大顺序子集 第一点要能连线,说明上下2个元素一样 第二点没有交叉,说明相同元素是顺序的 例如nums1[2,5,1,2,5]与nums2[10,5,2,1,5,2],第一个完全可以看成第二个的子集,但不是顺序的,所以最大值不是5 而[2,5,2],[5,1,5],[5,1,2]这种顺序不变的子集才是我们需要的,最大的子集元素为3 现在我们已经将这道题目转换成了求两个数组的最大原创 2021-05-21 15:09:14 · 625 阅读 · 1 评论 -
LeetCode题解——前K个高频单词
LeetCode题解——前K个高频单词题目介绍解题思路这题需要抓住2个关键点,排序,每个元素出现次数,那么很容易可以想到用一个key-value相关的容器来存放数据,同时value存放出现次数 现在有两种可以,一是map,但是map不好排序(但也有方法),另一种用pair的方法插入到vector,可以用自带的sort函数进行排序了 不管如何首先先遍历words数组,取出key-value存放到map里面,然后接下来就是一个排序的操作了,如果出现次数相同按字母排序否则按次数排序 dict原创 2021-05-20 14:48:57 · 201 阅读 · 0 评论 -
LeetCode题解——形成两个异或相等数组的三元组数目
LeetCode题解——形成两个异或相等数组的三元组数目题目介绍解题思路由a==b可知a^b==0 然后观察a与b的表达式,发现a和b的组合是数组一个连续的区间arr[i]...arr[j-1],arr[j]...arr[k] 由上面两点可知我们要找到一个区间[i,k],使得这里面的元素的异或值等于0,j的取值(i,k],j有几种可能,就是有几种符合条件的三元组 所以我们只要遍历arr,找到所有异或值位0的子区间代码示例class Solution {public: int原创 2021-05-18 11:34:52 · 170 阅读 · 0 评论 -
LeetCode题解——两数相加
LeetCode题解——两数相加题目介绍解题思路同时遍历l1和l2,计算两个节点的数据和,注意一下进位 利用递归的方式遍历,只有当两个链表的next都为空的时候返回,但是返回时要看一下有没有上个节点的进位,没有就返回NULL,否则返回值为1的节点代码示例/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode()原创 2021-05-17 22:02:46 · 238 阅读 · 1 评论 -
LeetCode题解——二叉树的堂兄弟节点
LeetCode题解——二叉树的堂兄弟节点题目介绍解题思路这题考察的就是树的遍历,其中带有2个条件遍历树 第一个条件记录下x和y出现的深度 第二个条件记录下x和y的父节点 当父节点不同xy深度相等就是满足题目的堂兄弟节点代码示例/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2021-05-17 11:00:10 · 261 阅读 · 0 评论 -
LeetCode题解——数组中两个数的最大异或值
LeetCode题解——数组中两个数的最大异或值题目介绍解题思路第一种暴力解法,双重循环时间复杂度O(n2),不符合题目要求。 第二种字典树,我们先要知道一点,异或就是相同为0,否则为1,那么我们随机给出一个数nums[i]怎么让它的异或结果最大呢,是不是要选择一个和num[i]二进制位数基本相反的,就是你是1,那我就选0 比如nums[i]= 00101,那么是不是选择一个11010的数和它异或结果最大 那么如何找到这个值呢,可以通过字典树来完成,树的左为0,右分支为1 我们先把nu.原创 2021-05-16 10:27:31 · 499 阅读 · 0 评论 -
LeetCode题解——x 的平方根
LeetCode题解——x 的平方根题目介绍解题思路方法一:i取值从1开始,用i平法结果与目标x对比,当i+1>x,那么i就是目标值 方法二:二分法,每次用中间值与x比较,当右边是大于x的值,当跳出循环,那么right的平方就是无限逼近x的那个,返回right-1就是最后结果代码示例class Solution {public: int mySqrt(int x) { if(0 == x || 1 == x){ return x;原创 2021-05-15 17:20:06 · 210 阅读 · 0 评论 -
LeetCode题解——最长回文子串
LeetCode题解——最长回文子串题目介绍解题思路方法一:暴力解题法,遍历字符串,以当前字符为中心向两边扩散,获取到最大的回文数长度 方法二:动态规划,判断一个字符串是不是回文,只要满足首尾相等,同时去除首尾后的字符串是一个回文字符串,那么这个字符串就是回文 现在我们用一个dp[i][j]数组来表示i到j是不是回文字符串,是的话值为1,否则为0,那么我们要判断i到j是否是回文只要判断s[i]==s[j]&&dp[i+1][j-1]是否为真 然后我们取出dp里面的最大值,就原创 2021-05-15 15:52:15 · 213 阅读 · 0 评论 -
LeetCode题解——加一
LeetCode题解——加一题目介绍解题思路这题其实只要注意一点就可以了,那就是注意当前数组元素的值是不是9,还有就是99,9这种特殊情况,要在容器的头部多插入一位1代码示例class Solution {public: vector<int> plusOne(vector<int>& digits) { vector<int>::iterator it = digits.end()-1; *i.原创 2021-05-15 13:42:23 · 112 阅读 · 0 评论 -
LeetCode题解——外观数列
LeetCode题解——外观数列题目介绍解题思路这题也有点类似动态规划的意思 这题的最核心的部分就是将一个字符串进行分割,统计出用多少个相同的字符,11就是21表示2个1,21就是1211表示1个2,1个1 图中所知第一次字符串是1固定的,然后传入一个次数的值n,表示解析第n-1次的结果字符串,那第n-1次的结果字符串是怎么来的呢,就是解析的n-2次的结果字符串 已知第一次为1,我们可以第二次的字符串解析结果就是11表示1个1,那么可以依次获取到第n次的解析结果了,代码示例我用的是非递归的原创 2021-05-15 13:10:56 · 108 阅读 · 1 评论 -
LeetCode题解——最大子序和
LeetCode题解——最大子序和题目介绍解题思路这道题其实也是一个动态规划题,我们先来想一个问题以下标i结尾的最大连续子数组的和sum[i]是多少? 是不是以i-1结尾的sum[i-1]+num[i],只要sum[i-1]是正的那么sum[i]肯定就是最大值了,所以我们可以得出一个结论sum[i] = sum[i-1]>0?sum[i-1]+num[i]:num[i] 那么我们是不是同理可以分别求出以0,1,2,3,4....len结尾的最大连续子数组的和?那么我们从中取一个最大值就原创 2021-05-15 11:07:12 · 101 阅读 · 0 评论 -
LeetCode题解——最后一个单词的长度
LeetCode题解——最后一个单词的长度题目介绍解题思路这题中心思想就是找到字符串最后一个从不为空字符开始到为空字符开始的子字符串,c++里面有多种思路可以解决,下面举2种常见的,易于思考到的第一种,用c++的find函数,从字符串的末尾开始find,首先找到第一个不为空字符的index,然后从这个index开始找到第一个为空字符的位置,这个位置距离就是字符串长度第二种,用迭代器从字符串后面开始遍历,记录从第一个不为空到为空的距离,其实find内部也是用的遍历代码示例方法一:原创 2021-05-15 10:42:06 · 125 阅读 · 0 评论 -
LeetCode题解——搜索插入位置
LeetCode题解——搜索插入位置题目介绍解题思路题目的意思是当存在目标元素就返回下标,没有就把目标插入到合适的位置 那么存在的情况很简单,那何时插入元素,可以这么想只有当遇到第一个比目标大的数据才会将数据插入 如果数组里面没有比目标数据大的,那就插入到最后代码示例class Solution {public: int searchInsert(vector<int>& nums, int target) { int len= nums.原创 2021-05-14 23:37:09 · 129 阅读 · 0 评论 -
LeetCode题解——实现 strStr()
LeetCode题解——实现 strStr()题目介绍解题思路方法一:用c++自带的find函数可以很容易解决,但是明显违背了题目的意愿 方法二:遍历haystack,当haystack的当前字符haystack[index]与needle的首字符一样,就进入while循环比对后面的 当相同字符的长度等于needle的长度,说明needle是haystack的子串,返回i-needle长度,即是needle在haystack中的下标位置 如果相同字符的长度不等于needle的长度,说明不是原创 2021-05-14 23:10:30 · 125 阅读 · 0 评论 -
LeetCode题解——移除元素
LeetCode题解——移除元素题目介绍解题思路这题的解题思路其实和LeetCode题解——删除有序数组中的重复项_yxh_1_的博客-优快云博客蛮像的 首先我们定义一个index,把index看成我们想要的结果下标,遍历数组,当元素的值与目标值不一样时,那就将元素拷贝到nums[index++] 那么最后到index结束的前面所有的元素都是不包含val的,而新的数组长度就是index+1,也就是原来数组长度减去val出现的次数代码示例class Solution {publi原创 2021-05-14 22:39:24 · 149 阅读 · 0 评论 -
LeetCode题解——删除有序数组中的重复项
LeetCode题解——删除有序数组中的重复项题目介绍解题思路这题并不是让我们真的把元素给删除,而是出现重复的元素的时候,将后面的元素往前移动,然后返回一个没有重复元素的长度,即最后一个不重复元素的下标+1 我们定义一个index来表示遍历过的最后一个没有重复的元素位置,然后当后面有不同元素出现是就将这个元素拷贝在index+1的位置】代码示例class Solution {public: int removeDuplicates(vector<int>&原创 2021-05-14 22:21:32 · 105 阅读 · 0 评论 -
LeetCode题解——合并两个有序链表
LeetCode题解——合并两个有序链表题目介绍解题思路这题的解题思路可以分为两种,第一种暴力解法,直接创建一个新的链表,然后比较2个输入链表,将小的节点一次赋值过去,然后最后返回创建的新的链表 第二种解法,类似于动态规划的思想,我每次比较两个链表选出最小的节点,知道把所有节点连上 比如图中的例子,首先利用mergeTwoLists函数选出1,同时1的next节点指向mergeTwoLists(剩下的2个链表)选出的第二大节点,依次递归调用代码示例class Solution {pu原创 2021-05-14 21:29:52 · 134 阅读 · 0 评论 -
LeetCode题解——有效的括号
LeetCode题解——有效的括号题目介绍解题思路这题可以从两个角度来考虑,首先第一种寻找删除,在字符串里面查找成对出现的括号,然后用空格替换,最后检查字符串是不是为空 第二种,好比消消乐一样,当正确的配对括号就删除,首先我们创建一个栈,然后遍历字符串 当第一次栈为空,直接将元素字符入栈,然后接下来每次的字符和栈首对比,如果是配对括号,就将栈首出栈,否则入栈,遍历完字符串后,通过查看栈是否为空 第二种比第一种的时间复杂度要好点,但是多了一个栈的空间,相当于空间换时间代码示例第一种:原创 2021-05-14 20:55:54 · 182 阅读 · 0 评论 -
LeetCode题解——整数转罗马数字
LeetCode题解——整数转罗马数字题目介绍解题思路将整数转换为罗马数字,从最大值开始转换 首先创建一个整数与罗马数字对照关系的字典dict,便于查询 然后遍历dict,只要目标数字比当前指向的罗马数字大,就减去这个罗马数字对应的整数值,同时将罗马数字保存到结果string 知道目标数字变为0,即全部转换完成代码示例class Solution {public: string intToRoman(int num) { vector<pair<原创 2021-05-14 10:06:47 · 142 阅读 · 0 评论 -
LeetCode题解——停在原地的方案数
LeetCode题解——停在原地的方案数题目介绍解题思路动态规划,将整个大题进行拆分,声明一个容器dp[n][m],n代表多少步,m是数组下标 已知要走到dp[n][0],有2种方法,dp[n-1][0]保持不变,dp[n-1][1]左移一步 因此走到dp[n][0]的方法就是走到dp[n-1][0]的方法数加上走到dp[n-1][1]的方法数 依次类推dp[n-1][1]=dp[n-2][0]+dp[n-2][1]+dp[n-2][2],就这样一直算到dp[2][0]=d...原创 2021-05-13 17:38:58 · 176 阅读 · 0 评论 -
LeetCode题解——子数组异或查询
LeetCode题解——子数组异或查询题目介绍思路分析题目中有两个vector,第一个arr是存放的所有元素,第二个queries是存放的arr数组元素的起始和结束下标 第一种方法是遍历queries,然后每次遍历一边arr取得异或结果保存,时间复杂度n*n 第二种方法已知特性a^a = 1,那么我们可以先求出arr前1,2,3所有的异或值,放在一个参考字典dict里面,dict[i]表示arr前i个元素的异或。 然后遍历queries,获取起始和结束位置left,right,dict[l原创 2021-05-12 15:47:29 · 232 阅读 · 1 评论 -
LeetCode题解——解码异或后的排列
LeetCode题解——解码异或后的排列题目介绍解题思路 这一题的思路和之前的这一题很像,唯一区别就是没有告诉首个元素的值,那这一题的核心思路就是求出perm[0] LeetCode题解——数组异或操作_yxh_1_的博客-优快云博客已知一点a^a=1 题目中说了perm是由前n个正整数组成的,那么可以有下面一点结论total=1^2^3……^n=perm[0]^perm[1]^perm[2]^……perm[n-1] encoded[0]=...原创 2021-05-11 11:26:14 · 162 阅读 · 1 评论 -
LeetCode题解——叶子相似的树
LeetCode题解——叶子相似的树题目介绍解题思路前序遍历二叉树,将叶子节点保存下来 比较2个二叉树的叶子节点代码示例/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {}原创 2021-05-10 19:35:32 · 136 阅读 · 0 评论 -
LeetCode题解——制作 m 束花所需的最少天数
LeetCode题解——制作 m 束花所需的最少天数题目介绍解题思路1.bloomday数组的元素要大于m*k,即花园里面的花要足够 2.当材料足够的时候,获取到bloomday的最大值,即花成熟的最大时间max,max是一定能够成功制作花束的时间 3.最小时间在最小天数1到最大天数max之间,就可以转换为另一个问法了,在1到max天的区内选择一个最小的天数,能够满足制作花束的条件 4.现在就是个二分法的题目了,每次取中间值尝试,直到最小的满足条件值。代码示例class Soluti原创 2021-05-09 16:12:32 · 174 阅读 · 0 评论 -
LeetCode题解——数组异或操作
LeetCode题解——数组异或操作题目介绍解题思路先算出nums数组元素的值,然后遍历进行异或,可以使用动态异或的方法,遍历的同时异或代码示例class Solution {public: int xorOperation(int n, int start) { int res = start; for(int i = 1; i<n; i++) { res = res ^ (start + 2*i);原创 2021-05-07 11:12:25 · 144 阅读 · 0 评论 -
LeetCode题解——解码异或后的数组
LeetCode题解——解码异或后的数组题目介绍解题思路这题主要考察了一点异或运算的性质,如下:异或运算满足交换律和结合律; 任意整数和自身做异或运算的结果都等于 0,即 x⊕x=0; 任意整数和0做异或运算的结果都等于其自身,即 x⊕0=0⊕x=x。当 1≤i<n 时,有 \textit{encoded}[i-1]=\textit{arr}[i-1] \oplus \textit{arr}[i]encoded[i−1]=arr[i−1]⊕arr[i]。在等号两边同时异或 \t.原创 2021-05-06 10:01:09 · 155 阅读 · 0 评论 -
LeetCode题解——最长公共前缀
LeetCode题解——最长公共前缀题目介绍解题思路第一步:将第一个字符串当成最长公共前缀第二步:将最长公共前缀与之后的字符串按照字符挨个比较,直到不一样,截取相同的部分当成最长公共前缀。代码示例class Solution {public: string longestCommonPrefix(vector<string>& strs) { string res = strs[0]; bool flag = true;原创 2021-05-05 19:45:22 · 121 阅读 · 0 评论 -
LeetCode题解——罗马数字转整数
LeetCode题解——罗马数字转整数题目介绍解题思路初一看就是遍历字符串,然后将字符转换为对应的数值相加,但是会有特殊情况IV,XL这种,仔细看可以发现规律,那就是左边的字会比右边的低。到这里我们就可以得出一个结论,那就是如果一个字符的值比后一个高,那就加上这个值,如果比后面一个低,那就减去这个值。代码示例class Solution {public: int romanToInt(string s) { map<char,int> m_dic原创 2021-05-05 17:19:36 · 103 阅读 · 0 评论 -
LeetCode题解——回文数
LeetCode题解——回文数题目介绍解题思路其实这题的思路换个角度可以这么看,将为正整数取反和原来的数相等,那就是回文数。由此有以下几个步骤:第一:如果为负数直接返回false第二:0到9可以直接返回true第三:除去前两点,然后就是进行取反,作比较。代码示例class Solution {public: bool isPalindrome(int x) { long res = 0; //防止int型溢出 long t原创 2021-05-05 16:31:44 · 143 阅读 · 0 评论 -
LeetCode题解——打家劫舍
LeetCode题解——打家劫舍题目介绍解题思路这题的解题思路其实和LeetCode题解——删除并获得点数_yxh_1_的博客-优快云博客一样都是动态规划假设我现在需要偷窃最后一间房子也就是nums[3],现在要考虑一点到底要不要偷,因为相连两间房,偷了相连的一间就会发生警报。第一种偷窃nums[3]:也就是偷窃倒数第三间的总金额dp(n-2)加上nums[3]的最后总金额要大于等于偷窃倒数第二次nums[2]的最大总金额dp(n-1)。第二种不偷窃:和第一种情况相反,偷窃倒数第二原创 2021-05-05 15:53:55 · 244 阅读 · 0 评论 -
LeetCode题解——删除并获得点数
LeetCode题解——删除并获得点数题目介绍解题思路这是一类动态规划的题目,假设nums = [2,2,3,3,3,4],我们进行一次映射转换sum[0,0,4,9,4],第一行是sum下标也是nums的值,第二行是sum值,那题目的意思可以转换为sum数组,相连的两个数不能同时取,求sum里面元素怎么相加才能最大。0 1 2 3 4 0 0 2*2 = 4 3*3 = 9 1*4 = 4 那么最后一次相加求和,对于要不要加上s.原创 2021-05-05 15:12:03 · 384 阅读 · 0 评论