社团算法打卡
算法相关
苦泉
这个作者很懒,什么都没留下…
展开
-
leetcode每日一题-110:平衡二叉树
leetcode每日一题-110:平衡二叉树链接平衡二叉树题目分析遍历树,然后每次判断树的左右两个子树的差值即可。代码C++/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nul原创 2021-11-28 18:04:53 · 4293 阅读 · 1 评论 -
leetcode每日一题-21:合并两个有序链表
leetcode每日一题-21:合并两个有序链表链接合并两个有序链表题目分析我们设置一个虚拟头节点和新链表的尾节点,然后一直遍历两个链表,往新链表尾节点后面插入即可。代码C++/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} *原创 2021-11-27 20:57:59 · 477 阅读 · 1 评论 -
leetcode每日一题-49:字母异位词分组
leetcode每日一题-49:字母异位词分组链接字母异位词分组题目分析不同的字母字节分组是比较难的,但是我们可以对每个字符串转化到一个中间态,然后根据中间态进行分组就容易了许多,接下来的问题是如何定义中间态,我们定义字符串中字符从小到大排列是中间态。代码C++class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs)原创 2021-11-25 19:08:32 · 463 阅读 · 3 评论 -
leetcode每日一题-423:从英文中重建数字
leetcode每日一题-423:从英文中重建数字链接从英文中重建数字题目分析首先我们先分析每个字母的组成,然后发现一些字符只在一个单词中出现,我们先去统计一下这些单词个数。z,w,u,x,g都只出现在一个数字中,也就是0,2,4,6,8,我们用哈希表统计一下s字符串中各个字符的数量,就可以知道0,2,4,6,8的数量,然后我们注意一下只在两个数字中出现的字符。h 只在 3,8 中出现。由于我们已经知道了 8 出现的次数,因此可以计算出 3 出现的次数。f 只在 4,5 中出现原创 2021-11-24 12:41:40 · 4794 阅读 · 2 评论 -
leetcode每日一题-859:亲密字符串
leetcode每日一题-859:亲密字符串链接亲密字符串题目分析题目本身不是很难,但是有不少需要注意的地方,逐一来进行分析。首先如果两个字符串不一样长,那么肯定是false。然后考虑长度相等的情况,如果s和goal刚开始就一样答案是什么呢?如果是类似于ab,ab这种类型的,那么也是false,因为这种交换之后一定就不相等了;如果是aa和aa这种,在一些对应位置有相同的元素,那么交换后是true。在来考虑值不相等的情况,首先从前往后遍历找到第一个不一样的位置下标,然后从后往前遍历找到最后一原创 2021-11-23 14:50:29 · 4555 阅读 · 1 评论 -
leetcode每日一题-559:N叉树的最大深度
leetcode每日一题-559:N叉树的最大深度链接N 叉树的最大深度题目分析简单的搜索题目。只需要从根节点开始dfs一下整个N叉树就可以得到答案了。主要是对dfs要理解和掌握N叉树的遍历。代码C++/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) {原创 2021-11-21 15:24:43 · 2315 阅读 · 4 评论 -
leetcode每日一题-594:最长和谐子序列
leetcode每日一题-594:最长和谐子序列链接最长和谐子序列题目分析因为最大值和最小值差值为1,那么这个序列中就只能存在两种类型的数字。遍历数组每次以当前值为最小值,查询当前值加1的值的数量是多少,两种类型的数字之和就是一个和谐序列的长度。那么我们如何快速获得x+1的数量呢,我们可以先用哈希表存储每中类型数字的数量,然后直接获取即可。代码C++class Solution {public: int findLHS(vector<int>&原创 2021-11-20 12:11:47 · 833 阅读 · 3 评论 -
leetcode每日一题-397:整数替换
leetcode每日一题-397:整数替换链接整数替换题目分析直接dfs枚举所有情况即可。代码C++class Solution {public: int res = INT_MAX; int integerReplacement(int n) { dfs(n, 0); return res; } // 这里用longlong是因为INT_MAX+1会爆int void dfs(long原创 2021-11-19 11:47:55 · 113 阅读 · 1 评论 -
leetcode每日一题-563:二叉树的坡度
leetcode每日一题-563:二叉树的坡度链接二叉树的坡度题目分析简单的dfs问题。首先明确思路,我们需要遍历每一个点,然后求出该点左右子树的值的总和,然后做差,答案累计这个差值即可。那么问题就转化到求每个节点左右子树值的综合上面,同样是一个dfs问题,但是这个问题有一个优化,我们在之后的代码部分进行详细的分析。代码C++/** * Definition for a binary tree node. * struct TreeNode { * int va原创 2021-11-18 18:19:25 · 2169 阅读 · 4 评论 -
leetcode每日一题-13:罗马数字转整数
leetcode每日一题-13:罗马数字转整数链接罗马数字转整数题目分析这个题总体上来说是一个遍历题目。我们遍历每一位看看当前字母应该转化成什么阿拉伯数字,唯一需要注意的就是题目中给出的三种特殊的双字符组合构成数据的方式,但是这也很容易处理,每次我们遍历到I,X,C,这个几个字母的时候,查看一下后方是不是相应的组合字符即可。然后累计所有值就是答案。代码C++class Solution {public: int romanToInt(string s) {原创 2021-11-17 10:15:03 · 143 阅读 · 2 评论 -
leetcode每日一题-191:位1的个数
leetcode每日一题-191:位1的个数链接位1的个数题目分析这是一个基础考察题目。首先根据已给代码,我们知道给的是一个无符号的32位整数,那么什么叫32位整数呢?我们都知道,现行的计算机都是二进制计算机,底层都是二进制,对于存储数据的每一个0或1,称之为一位(1bit),那么32位整数,其实就是由32位0或1组成的整数。这样了解之后,我们就可以比较轻松的解出题目了,只需要对每一个二进制位上的数据进行枚举即可,根据语言提供的位运算符号>>和&,我们就可以解决问题了原创 2021-11-16 21:21:45 · 1592 阅读 · 4 评论 -
leetcode每日一题-319:灯泡开关
leetcode每日一题-319:灯泡开关链接灯泡开关题目分析这里官方分析的很好,就直接采用官方的分析了代码C++class Solution {public: int bulbSwitch(int n) { return (int)sqrt(n); }};Javaclass Solution { public int bulbSwitch(int n) { return (int) Math.sqr原创 2021-11-15 16:52:58 · 1065 阅读 · 6 评论 -
leetcode每日一题-20:有效的括号
leetcode每日一题-20:有效的括号链接有效的括号题目分析这个题目是栈的经典应用。我们每次遇到右括号的时候将他加到栈中,每日遇到左括号的时候,取出栈顶(也就是和当前右括号距离最近的左括号),看看是否对应,如果此时栈顶不存在,也就说明右括号少于左括号,一定不合法,如果不匹配,那么也一定不合法。等遍历结束的时候,如果栈中还有元素剩余,那么说明右括号多于左括号,那么这也不合法。综上就可以判断出这个字符串是否合法了。代码C++class Solution {public:原创 2021-11-14 10:59:39 · 2126 阅读 · 5 评论 -
leetcode每日一题-520:检测大写字母
leetcode每日一题-520:检测大写字母链接检测大写字母题目分析模拟分析题,遍历一下字符串统计一下其中的大小写字母然后根据大小写字母的数量判断即可代码C++class Solution {public: bool detectCapitalUse(string word) { int n = word.size(); // 统计大写,小写字母的数量 int big = 0, little = 0;原创 2021-11-13 09:52:44 · 2149 阅读 · 4 评论 -
leetcode每日一题-14:最长公共前缀
leetcode每日一题-14:最长公共前缀链接最长公共前缀题目分析问题其实很简单,可以纵向遍历数组,然后找出来,但是有一种比较简单的办法,那就是对字符串数组进行排序,然后比较第一个和最后的一个的最长公共前缀就可以了,因为排序之后,数组中的最后一个字符串和第一个字符串是相差最大的字符串,相差最大的两个字符串求公共前缀,也一定是符合整个数组的.代码C++class Solution {public: string longestCommonPrefix(vector原创 2021-11-12 17:50:39 · 1558 阅读 · 1 评论 -
leetcode每日一题-7:整数反转
leetcode每日一题-7:整数反转链接整数反转题目分析题目不是很难,但是细节很多,并且不允许存储64位整数,需要考虑很多的东西.在之后的代码部分逐一分析.代码C++class Solution {public: int reverse(int x) { int f = 1; // 标记一下正数还是负数 if(x < 0) f = -1; int maxn = INT_M原创 2021-11-11 15:22:58 · 2232 阅读 · 0 评论 -
leetcode每日一题-495:提莫攻击
leetcode每日一题-495:提莫攻击链接提莫攻击题目分析从第二位开始枚举,每次判断和前一次的间隔是多少,然后判断出中毒的描述,遍历结束后,因为最后一次施加的中毒状态一定可以持续完整的中毒事件,所以最后再加上duration.代码C++class Solution {public: int findPoisonedDuration(vector<int>& timeSeries, int duration) { int re原创 2021-11-10 11:01:32 · 1163 阅读 · 0 评论 -
leetcode每日一题-58:最后一个单词的长度
leetcode每日一题-58:最后一个单词的长度链接最后一个单词的长度题目分析语法题,注意结尾的多空格即可代码C++class Solution {public: int lengthOfLastWord(string s) { string res = ""; for(int i=s.size()-1 ; i>-1 ; i--) { if(s[i] == ' ')原创 2021-11-09 21:26:24 · 379 阅读 · 0 评论 -
leetcode每日一题-299:猜数字游戏
leetcode每日一题-299:猜数字游戏链接猜数字游戏题目分析虽然是一个中等题,但是其实十分的简单.我们只需要先按照最小长度遍历一遍两个字符串的前缀,然后统计一下同位置并且数字相同的结果,然后把这些点标记一下,然后将secret中没有匹配的加入哈希表,遍历guess来统计一下不同位置数字相同的答案即可.代码C++class Solution {public: string getHint(string secret, string guess) {原创 2021-11-08 11:11:30 · 5642 阅读 · 4 评论 -
leetcode每日一题-598:范围求和(二)
leetcode每日一题-598:范围求和(二)链接范围求和 II题目分析每次添加都是从(0,0)加到(a,b),(0,0)一定是统计次数最多的,所以我们找到所有的等于(0,0)的值即可,那么矩阵中的哪些值等于(0,0)中的值呢,我们这样来考虑,找到所有a中的最小值x,找到所有b中的最小值y,那么因为x,y分别是a,b的最小值,所以他们和(0,0)一样一直被+1,所以答案就显而易见了.代码C++class Solution {public: int maxCou原创 2021-11-07 20:17:27 · 1474 阅读 · 2 评论 -
leetcode每日一题-26:删除有序数组中的重复项
leetcode每日一题-26:删除有序数组中的重复项链接删除有序数组中的重复项题目分析这是实现一个简单的去重操作,需要掌握,首先我们从0开始,然后每次找到不重复的元素加入其中,因为数组是有序的,只需要从前往后遍历即可.代码C++class Solution {public: int removeDuplicates(vector<int>& nums) { // 数组去重后的存储位 int idx = 0;原创 2021-11-06 10:42:04 · 163 阅读 · 0 评论 -
leetcode每日一题-1218:最长定差子序列
leetcode每日一题-1218:最长定差子序列链接最长定差子序列题目分析简单的逻辑分析问题,因为是等差序列,所以只需要遍历数组,然后每次以当前位置为结尾的位置,然后再加上之前的所有值即可,同时动态维护最大值,就能得到答案.代码C++class Solution {public: int longestSubsequence(vector<int>& arr, int d) { int res = 0; //原创 2021-11-05 19:37:27 · 945 阅读 · 3 评论 -
leetcode每日一题-367:有效的完全平方数
leetcode每日一题-367:有效的完全平方数链接有效的完全平方数题目分析这个其实是很简单的浮点数二分问题,我们只需要用浮点数二分来求出sqrt(num)然后再进行判断即可代码C++class Solution {public: bool isPerfectSquare(int num) { double l = 0, r = num; while(fabs(r - l) > 1e-6) {原创 2021-11-04 18:07:39 · 943 阅读 · 3 评论 -
leetcode每日一题-9:回文数
leetcode每日一题-9:回文数链接回文数题目分析首先,复数一定不是回文数,因为负号找不到对应的字符,那么我们只用判断正数的情况即可,我们每次获取最后一位,然后给他放到高位上继续添加下一个数位,为了避免颠倒之后的数据爆int,我们可以使用longlong来存储颠倒后的数据.代码C++class Solution {public: bool isPalindrome(int x) { if(x < 0) return 0; l原创 2021-11-03 08:48:39 · 155 阅读 · 0 评论 -
leetcode每日一题-575:分糖果
leetcode每日一题-575:分糖果链接分糖果题目分析我们先统统计所有糖果的种类,如果糖果的种类小于等于n/2,那么她就可以吃到所有种类的糖,如果糖的种类大于n/2,那么她就只能吃到n/2种类型的糖.代码C++class Solution {public: int distributeCandies(vector<int>& candyType) { int n = candyType.size(); uno原创 2021-11-02 16:05:26 · 200 阅读 · 0 评论 -
leetcode每日一题-27:移除元素
leetcode每日一题-27:移除元素链接移除元素题目分析运用双指针解决即可,开始时同时l和r指针均指向第一个元素,l指针表示遍历元素,r表示实际应该填写的位置,每次当遍历的l对应位置值不等于要删除的值的时候,就赋值到r位置,同时r++,遍历结束后,r的值就是答案.代码C++class Solution {public: int removeElement(vector<int>& nums, int val) { int l原创 2021-10-28 12:14:23 · 161 阅读 · 0 评论 -
leetcode每日一题-34:在排序数组中查找元素的第一个和最后一个位置
leetcode每日一题-34:在排序数组中查找元素的第一个和最后一个位置链接 在排序数组中查找元素的第一个和最后一个位置题目分析这个其实就是昨天题目的升级版本,掌握应用两种二分的模板即可,这两种模板可以应用在90%的整数二分问题当中代码c++class Solution {public: // 两个整数二分模板的应用 vector<int> searchRange(vector<int>& nums, int target原创 2021-10-27 11:17:45 · 175 阅读 · 0 评论 -
leetcode每日一题-35:搜索插入位置
leetcode每日一题-35:搜索插入位置链接题目分析简单的二分查找,查询到结果后,判断对应位置的值即可,然后>=返回检索位置,反之,返回l+1代码class Solution {public: int searchInsert(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1; while(l < r) {原创 2021-10-26 19:39:20 · 168 阅读 · 0 评论 -
leetcode每日一题-1:两数之和
leetcode每日一题-1:两数之和链接题目分析暴力最简单的做法显然就是暴力,我们直接双重循环遍历寻找即可哈希表那么如何优化呢,我们可以先把数组都存入hashmap,然后遍历这个数组,然后找他对应的target-x是否存在,并且这个数不能是他本身codeC++class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unor原创 2021-10-25 19:32:07 · 223 阅读 · 0 评论 -
leetcode每日一题-66:加一
leetcode每日一题-66:加一链接题目分析这个可以理解为简单的大数加法,数组中的每一位存一个数位,这样就可以运算很大的数据了,这个问题是大数加法的简化版代码class Solution {public: vector<int> plusOne(vector<int>& digits) { int len = digits.size(); // 首先判断会不会进位,如果不进位,个位直接+1返回原创 2021-10-24 10:58:04 · 84 阅读 · 1 评论 -
leetcode每日一题-492:构造矩形
leetcode每日一题-492:构造矩形题目分析l和w均为整数,并且要求l>=w,而且要求l和w差距尽可能地小,其实就是枚举area都乘积为area的因数对,然后找到插值最小的一对即可.代码class Solution {public: vector<int> constructRectangle(int area) { vector<int> res; // 差值 int ex = area -原创 2021-10-23 21:36:51 · 128 阅读 · 0 评论