自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简要记录下long long 乘 size_t类型是ull

以后注意用到 .size() 都给强制类型转换,size_t等级更高,long long 会跟他对齐。

2023-08-06 21:09:25 505

原创 c++处理浮点数技巧

double精度有限,要么在算法层面修改避免除法;例如判断斜率是否相等,要算ab=cd\frac{a}{b} = \frac{c}{d}ba​=dc​可以比较ad=bcad = bcad=bc;或者用long double要求四舍五入时有时答案不对,可以加上个1e-9,意思是两个浮点数精度误差在一定范围内就认为是同一个数...

2022-06-06 21:36:33 1350

原创 力扣1129. 颜色交替的最短路径(BFS)

本题和一般的BFS求最短路有所不同;一般的最短路BFS中,更新到每个点的距离,并设置vis数组,避免重复访问;但对于本题是可能重复访问的,因为要红蓝交替,为到达某一结点,可以以红边访问过后再次用蓝边访问,可能达到其他点的最优解;但也就需要在此多设个vis状态位即可,当分别以红蓝边访问过,就等同于以前的BFS;这样队列里就要多存个边的颜色的信息;BFS不断更新答案即可;class Solution {public: vector<int> shortestAlterna...

2022-05-11 20:23:22 626

原创 力扣6050. 字符串的总引力

解题思路记录每个字母上一次的下标,累加贡献;设定贡献为一个字母在子字符串第一次出现时产生贡献,后续重复出现不贡献;则每次贡献为 左边有 i - lastpos 种选法,右边有 n - i 种选法;初始位置设为-1;代码class Solution {public: long long appealSum(string nums) { vector<int> lastpos(26, -1); long long sum = 0; ...

2022-05-01 21:43:54 361

原创 力扣167. 两数之和 II - 输入有序数组(二分)

枚举每个位置,在其之后的非递减序列中二分的找和的另一半;巧妙利用库函数可以大幅减少做题时间复杂度class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int n = numbers.size(); for(int i = 0; i < n - 1; i++) { int t = target -..

2022-04-27 15:27:10 173

原创 力扣第 288 场周赛

发公众号上了,粘链接如下题目链接题解链接

2022-04-10 22:14:22 344

原创 招商银行专场竞赛

题目链接题解链接补充下第四题的滚动数组版class Solution {public: typedef long long ll; int goShopping(vector<int>& A, vector<int>& B) { int n = A.size(); vector<pair<int, int>> p(n); for(int i = 0; i < n; i

2022-04-10 22:11:56 365

原创 力扣1525——字符串的好分割数目(前缀后缀、状压)

前缀后缀,统计每个位置之前和之后出现字母次数,用一个32位整数代表26个字母出现过哪几个,出现字母个数相等就算一个答案class Solution {public: int numSplits(string s) { int n = s.size(); if(n == 1) return 0; vector<int> pre(n), aft(n); pre[0] = 1 << (s[0] - 'a');...

2022-04-07 02:44:42 262

原创 力扣726——原子的数量(递归)

递归+map自动升序因为有括号的存在,分解为小问题处理class Solution {private: map<string, int> cnt;public: void count(string s, int t) { //cout << s << endl; if(s == "") return ; if(s.find('(') == s.npos) { //无括号 ...

2022-03-21 23:07:08 311

原创 力扣782——变为棋盘(数学模拟)

解题思路行与行之间的交换,不会改变列内关系,同样列列交换不会改变行;因此,只会有两种行,两种列,并且每行每列1,0的个数相等(n为奇数时相差1);并且这两行是相反的关系,只有这样交换完成后才会是两种相反的关系;按此规则对矩阵进行合法判定;交换次数即是与对应位置不等的个数/2;之后分奇偶讨论:偶数时,首位01皆可,且行与列没有关系,取两两组合中的最小值;奇数时,首位字母是确定的,结束方案是确定的,交换次数应该从首位字母出现最多的行列确定:例如[[1,1,0],[0,0,1],[0,0,...

2022-03-21 21:56:03 320

原创 力扣1760——袋子里最少数目的球(二分答案)

题目链接最大化最小值 或 最小化最大值 ,都可以采用二分答案的方法,答案在一个确定的范围内,二分的取,每次check判定边界移动情况;本题就二分的找最终最大的数目;根据每次确定的mid数目,求出该数目下需要进行移动的次数,如果次数小于等于限制,说明mid取高了,还可以继续细分,否则取低了;class Solution {private: vector<int> arr; int limit;public: bool check(int mid) {

2022-03-04 18:21:01 324

原创 力扣802——找到最终的安全状态(拓扑排序)

题目链接如果一个节点的出度为0,则该节点是安全的;如果一个节点的所有下一节点都是安全的,则该节点是安全的;发现传递性,从所有初始为安全的节点(出度为0)的节点出发,往上找进入该安全节点的节点,并将新节点出度减一;如果新节点的出度为0了,说明也成安全节点了,知道无新增安全节点;所有出度为0的节点就是安全节点;class Solution {public: vector<int> eventualSafeNodes(vector<vector<int>>

2022-03-04 18:16:40 270

原创 力扣994——腐烂的橘子(多源BFS)

题目链接多源BFS,从每个腐烂的橘子同时出发,类似层序遍历,层数就是感染时间class Solution {public: vector<pair<int, int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}}; int orangesRotting(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(

2022-03-04 18:11:49 217

原创 力扣564——寻找最近的回文数

解题思路分情况讨论:突破点在于由一个回文串得到其下一个和上一个回文串;如果初始不是回文数,先按前半部分反转构造回文数(可以反证法证明这是最接近的之一,如果比初始大,就是大的里面最接近的,如果比初始小,就是小的里面最接近的),如果构造的比原来大,那求构造的上一个回文数,否则求下一个回文数,二者比较求答案;如果初始就是回文数,那么直接求该数的上一个和下一个回文数,比较得答案;对于一个回文数,求其上一个和下一个回文数,就是按中间位往两边减或加,注意0和9的特殊处理,需要不断进位;另外对于特殊边界情况..

2022-03-02 02:25:42 754

原创 力扣1601——最多可达成的换楼请求数目(状态压缩)

看数据范围这么小就想到状态压缩了,枚举2^16种方案,判断是否满足条件,取其中1数量最多的方案class Solution {public: int count(int x) { int ans = 0; while(x) { if(x % 2) ans++; x /= 2; } return ans; } int maximumRequests(int n,...

2022-02-28 00:45:50 289

原创 剑指 Offer II 082. 含有重复元素集合的组合(DFS)

计数,然后深搜,及时剪枝,代码一看就懂class Solution {private: vector<vector<int>> ans; vector<int> cnt = vector<int>(51, 0);public: void dfs(int pos, int remain, vector<int> tmp) { if(remain == 0) { ans.push..

2022-02-25 23:56:01 180

原创 力扣1095——山脉数组中查找目标值(二分)

三步走,找最大坐标,在左边找,在右边找先二分找最大值所在地;然后在左半边二分的找目标(升序);在右半边找目标(降序);建立一个数组记录已访问节点,减少重复访问次数;/** * // This is the MountainArray's API interface. * // You should not implement it, or speculate about its implementation * class MountainArray { * public: *...

2022-02-25 01:43:08 7611

原创 力扣1840——最高建筑高度(贪心)

找到真正的限制是关键解题思路如果高度限制就是建筑物的高度,那么最大值就很好求了;朴素的思路是多源BFS,但数据量太大,肯定不能求出每个建筑物的高度;所以可以贪心的只求确定高度建筑范围内的最大值;分情况讨论后可归纳公式为max(height, last_height) + (dis - abs(height - last_height)) / 2;但是给出的限制并不是真实的限制,会虚高,真实的限制只会更低;左边的限制会影响右边的限制,同时右边也会影响左边;左右两边的高度差最大不能超过...

2022-02-25 01:40:59 7133

原创 力扣43——字符串相乘(模拟)

解题思路num2的每位都乘num1,从头到尾依次乘十再相加(字符串操作就是末位添0再字符串模拟加法)代码class Solution {public: string plus(string s1, string s2) { int n1 = s1.size(), n2 = s2.size(); string ans = ""; int add = 0; for(int i = 0; i < max(n1, n2); i+.

2022-02-22 21:59:48 261

原创 力扣1994——好子集的数目(数学,状态压缩)

解题思路30以内的数就可以列出来了,详细可看代码最后;所以首先统计每个数字出现的次数,再看哪几个可以相互组合对于1,1可以随意重复出现,统计完其他后,答案乘2的(1出现次数)次幂;对于17,19,23,29,他们和任何人都互斥,可以任意放,计算完其他后可以更新为ans = ans + ((ans + 1) * cnt[num]) 原有答案+搭配该数+只选该数;对于其他的2,3,5,6,7,10,11,13,14,15,21,22,26,30;从中不重复的选任意个,然后判断合法性(该数出...

2022-02-22 15:19:56 307

原创 力扣827——最大人工岛(DFS)

解题思路dfs标记所有岛屿,再遍历每个0尝试链接不同编号的岛屿;为避免和0、1混淆,编号从10开始,取大小时再减10;代码class Solution {private: vector<vector<int>> g; vector<pair<int, int>> dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; vector<int> islands; //岛屿编号对应岛..

2022-02-22 15:14:58 310

原创 力扣2183. 统计可以被 K 整除的下标对数目(数学)

暴力的两两遍历会导致O(N^2),对于1e5的数据量超时;分析,要想整除​k,要求相乘的两个数要包含k的所有因数;为了避免重复计数,只用统计当前数左边有多少数满足要求,该要求就是和当前数相乘满足k的因数​要求;因此分为若干个桶,每个桶对应k的一个因数,桶内元素为包含该因数的元素​;每次只要找当前元素不能满足(也即不包含)的k的因数的桶,这个桶里的元素就是和当前元素相乘满足要求的元素,累加就是答案;之后将当前元素放入所有对应的桶中;复杂度为O(k + nlogk)class Solution .

2022-02-21 20:15:38 389

原创 力扣838——推多米诺(模拟,前缀后缀预处理)

解题思路分情况讨论,找点左右两边最近的字母,优化为预处理点左右两边最近的LR的距离;对于字母不用变,对于点要看左右两边最近的字母分别是什么;传统这样直接找点两边最近字母N^2会超时,需要优化;可以用类似前缀和的方式预处理,存下每个点左右两边最近的LR的距离,然后分情况讨论即可。总体O(N)代码class Solution {public: string pushDominoes(string dominoes) { vector<int> left,...

2022-02-21 20:10:57 139

原创 力扣166——分数到小数(模拟)

解题思路先处理负号,注意-INT_MAX转正会爆int;全转long long然后用除法得到小数点前的部分,之后模拟除法不断更新余数作为新的被除数;如果被除数再次出现,就是循环的断点;该数第一次出现的位置到当前末尾就是循环的部分;代码class Solution {public: string fractionToDecimal(int numer, int deno) { if(numer == deno) return "1"; if(numer ..

2022-02-21 20:06:24 233

原创 力扣1289——下降路径最小和 II(动态规划)

动态规划,dp[i][j]代表到i行j列的非0偏移的路径和,答案是min(dp[n-1][]),最后一行的最小值;更新过程中,dp[i][j] = min(dp[i][j], arr[i][j] + dp[i-1][k]) k∈[0, n-1] k≠j总体O(N3)O(N^3)O(N3)复杂度,标签是困难估计是给O(N2)O(N^2)O(N2)复杂度的,就是记录每行的最小和次小,避免k的那一重循环,有兴趣的可以自行尝试。另外dp[i][] 只与 dp[i-1][] 有关,可以用两个一维数..

2022-02-18 22:37:24 250

原创 力扣556——下一个更大元素 III

思路是找到下一个排列;对于求下一个排列,做法是1、从后往前找到第一个非递减的数a;2、然后从后往前找第一个比a大的数b3、交换ab,然后从小到大排a下标之后的元素;举例来说,14852,下一个排列应该是:15248;看一下怎么得来的,首先找到第一个非递减的数4;然后找第一个比4大的数5;交换45,即15842,重排交换处之后的842,即得15248;对于这样的做法,std里面有库函数next_permutation可以直接用int转string类型,找到下一个排列,在转回int,调库就完.

2022-02-18 22:35:27 387

原创 力扣1292——元素和小于等于阈值的正方形的最大边长(前缀和)

二位前缀和,前缀和的要点在于多申请一位,首位空着class Solution {public: int maxSideLength(vector<vector<int>>& mat, int threshold) { int m = mat.size(), n = mat[0].size(); int ans = 0, tmp_sum = 0; vector<vector<int>> s...

2022-02-18 22:34:09 237

原创 力扣1719——重构一棵树的方案数(图)

这道题的难点在于,给你的条件是有向图,但边的方向未知,需要根据节点的边的多少来判断边的方向;边最多的就是根节点,边越多子孙越多,辈分越高;对于多个满足的情况:就是两节点子孙数相同,也就是族谱上的单传关系,这两人的父子关系可以交换而不影响结果,从而产生多个解。详细看注释,总体思路是按边的多少排出辈分,确定边的关系,之后进行判断class Solution {public: int checkWays(vector<vector<int>>& pairs...

2022-02-16 17:34:05 145

原创 力扣2055——蜡烛之间的盘子(动态规划+前缀和)

解题思路f[i]记录0到i之间在蜡烛内的盘子的数量;遍历字符串,过程中记录蜡烛间盘子数量,直到遇到新蜡烛再更新f数组f[i] = f[i-1] + cnt;其余情况为f[i] = f[i-1];在计算区间l到r之间的盘子数时,f[r]代表r之前满足要求的盘子数,f[l]代表l之前的,但要求是l到r之间,所以要多减一些l到区间内第一个蜡烛(即l右侧第一个蜡烛)之间的盘子数;因此多遍历一遍,记录每个位置的右侧第一个蜡烛的位置right[i];这样每次查询的答案就是f[r] - f[right...

2022-02-16 17:15:39 584

原创 力扣1358——包含所有三种字符的子字符串数目(双指针)

双指针法找到所有出现abc的字符串,往后每多一位就多一个答案;在找所有出现abc字符串的过程中用双指针法避免O(N^2)超时,具体到代码上就是右指针加,左指针减复杂度O(N)class Solution {public: int numberOfSubstrings(string s) { vector<int> cnt(3, 0); int n = s.size(); int left = -1, right = 0; .

2022-02-14 21:04:13 6889

原创 __builtin_popcount () 统计有多少个1,在位运算上常用

__builtin_popcount ()用于计算一个 32 位无符号整数有多少个位为1

2022-02-13 20:47:34 224

原创 力扣93——复原 IP 地址(暴力)

解题思路每段长度为1~3,数值很小可以暴力枚举;对每一段进行IP判断,可以的话记录并往下进行,不行就跳过;四段全部满足要求的就是答案;套娃,代码还是好理解的;代码class Solution {private: vector<string> ans;public: bool isok(string s) { int n = s.size(); if(n > 3 || n == 0) return false; ...

2022-02-12 22:35:17 1180

原创 力扣701——二叉搜索树中的插入操作(递归)

解题思路按平衡二叉树规则递归往左右两边插,如果为空就新建一个节点代码class Solution {public: TreeNode* insertIntoBST(TreeNode* root, int val) { if(root == nullptr) { TreeNode* ans = new TreeNode(val); return ans; } if(root->val &...

2022-02-12 11:45:14 352

原创 力扣1020——飞地的数量(DFS)

解题思路从四条边开始dfs,消灭所有连通块,剩余的1就是答案代码class Solution {private: vector<vector<int>> g; int m, n;public: vector<pair<int, int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}}; void dfs(int x, int y) { g[x][y] = 0; ...

2022-02-12 11:26:15 253

原创 力扣752——打开转盘锁(BFS)

解题思路用set存不可达点和已访问点;层序遍历,每层加一步;对于每个位置有八种走法,相当于八叉树,但有很多剪枝,所以复杂度可以接受;当可以走且未访问过时则探索,否则跳过;当探索点是目标时直接返回当前步数就是最小步数代码class Solution {private: unordered_set<string> dead; unordered_set<string> vis; queue<string> q;public: ...

2022-02-12 11:22:15 282

原创 力扣1866——恰有 K 根木棍可以看到的排列数目(动态规划)

解题思路f[i][j]表示前i个木棍看到j个,f[n][k]即为答案;前i个木棍,i最高一定能被看到,如果他在最后一位,相当于由f[i-1][j-1]转移而来,在原来基础的末尾上添加一个;如果i不在最后一位,则最后一位一定是被挡掉的,可以有i-1种选择,不妨设选择x;而前面的i-1个数(0x-1,x+1i)的组合方案,能看到j个数;对此将x+1i这些数全部-1,令其等于xi-1,并不影响相对大小关系,看到的数跟原来一样;例如1,2,4的排列组合方案与1,2,3的个数相同;所以前面的i-1个..

2022-02-12 11:17:06 346

原创 力扣15——三数之和(哈希)

解题思路哈希统计次数,排序后依出现次数遍历aab,abb,abc三种情况代码class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { unordered_map<int, int> cnt; for(auto num : nums) cnt[num]++; vector<vector<..

2022-02-09 20:39:26 416

原创 力扣2044——统计按位或能得到最大值的子集数目(暴力+状态压缩)

解题思路选取下标不同算不同的子集,所以只用考虑位置;对于每个位置来说,子集的选取分选和不选两种状态;因此可以用n位的二进制数表示每种子集的选取方案,从所有选取方案中取最大的;总体复杂度O(2^n),对于给定数据范围16来说,2的16次方为65536不会超时代码class Solution {public: int countMaxOrSubsets(vector<int>& nums) { int n = nums.size(); ..

2022-02-08 21:28:43 261

原创 力扣1001——网格照明(哈希)

解题思路数据量很大,模拟实际场景不现实;因为灯可以直接点亮其所在行列和对角线,所以可以用哈希存储哪些行列对角线有亮光;总体分为三部分,1、统计所有亮光所在信息;2、对每次查询,看所在地是否亮;3、关掉查询地范围内的灯第一步:统计亮光这里可以先对灯泡去重,然后记录灯泡点亮的行列和两条对角线灯泡(x,y)所在行列不必多说,其所在对角线可找规律发现,左右对角线编号分别为 n - (y-x) 和 x + y + 1;从1到2n-1;用哈希表统计;第二步:判断对每次查询,看查询点所在的行列对角...

2022-02-08 01:29:38 669

原创 力扣394——字符串解码(递归)

题目(中等)给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例 2:输

2022-02-04 23:05:31 363

空空如也

空空如也

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

TA关注的人

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