力扣算法篇
kinghyt12138
keep moving(本人所写博客均为学习笔记,如有侵权联系删除)
展开
-
力扣每日一题:按照频率将数组升序排序
力扣每日一题原创 2022-09-19 09:58:29 · 202 阅读 · 1 评论 -
力扣算法篇:连续子数组的最大和
【代码】力扣算法篇:连续子数组的最大和。原创 2022-09-12 09:13:18 · 309 阅读 · 0 评论 -
力扣算法篇:两整数之和
题解:class Solution {public: int getSum(int a, int b) { //位运算 非进位采用XOR 进位采用AND 进位和非进位再相加 while(b){ //进位 防止有符号左移的溢出保护处理 auto c = (unsigned int)(a&b)<<1; //非进位 a = a^b; .原创 2021-09-26 21:28:46 · 116 阅读 · 0 评论 -
力扣算法篇:扁平化多级双向链表
题解:/*// Definition for a Node.class Node {public: int val; Node* prev; Node* next; Node* child;};*/class Solution {public: //先序遍历结果集 vector<Node*> v; //递归 先序遍历 void dfs(Node* head){ if(head == NULL){.原创 2021-09-24 23:15:47 · 137 阅读 · 0 评论 -
力扣算法篇:3的幂
题解:class Solution {public: bool isPowerOfThree(int n) { if(n<1){ return false; } int balance; while(n>1){ balance = n%3; if(balance!=0){ return false; .原创 2021-09-23 15:43:18 · 155 阅读 · 0 评论 -
力扣算法篇:分隔链表
题解:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(.原创 2021-09-22 10:44:40 · 196 阅读 · 0 评论 -
力扣算法篇:最后一个单词的长度
题解:class Solution {public: int lengthOfLastWord(string s) { //从最后开始 //计数 int count = 0; for(int i = s.size()-1;i>=0;i--){ if(s[i]!=' '){ count++; } //一旦计数开始 遇上空格 .原创 2021-09-21 10:15:49 · 137 阅读 · 0 评论 -
力扣算法篇:
题解:class Solution {public: int findNumberOfLIS(vector<int>& nums) { //动态规划 dp[i]:i之前包括i的最长递增子序列 nums[i]需要在该序列中 //j<i nums[i]>nums[j]时 dp[i] = max(dp[i],dp[j]+1); vector<int> dp(nums.size(),1); /.原创 2021-09-20 10:40:56 · 156 阅读 · 0 评论 -
力扣算法篇:只有两个键的键盘
题解:class Solution {public: int minSteps(int n) { //使用最少的操作次数 在记事本上输出恰好n个A //动态规划 dp[i] = min{dp[j]+i/j} 意为i个A由j个A经过一次复制 若干粘贴得到 粘贴次数为i/j-1 再加上一次复制操作 //j为i的因数 vector<int> dp(n+1); dp[1] = 0; //计算d.原创 2021-09-19 12:11:23 · 148 阅读 · 0 评论 -
力扣算法回溯篇:解数独
题解:1、确定回溯函数参数bool backtracking(vector<vector<char>>& board)2、确定递归终止条件无终止条件 填满为止3、单层搜索过程双重循环遍历棋盘,然后递归遍历某位置放9个数字的可能性class Solution {public: bool isVaild(int row,int col,char val,vector<vector<char>>& board){ .原创 2021-09-19 11:25:13 · 146 阅读 · 0 评论 -
力扣算法篇:Nim游戏
题解:class Solution {public: bool canWinNim(int n) { //n块石头 先手 拿到最后一块石头为胜者 //巴什博奕,n%(m+1)!=0时,先手总是会赢的 //面对4的倍数 这边拿N跟,对面拿4-N根,保证每回合共减四根,永远面对4倍数 直到4 但如果不是4的倍数 就可以让对方陷入这样的境地 必赢 if(n%4 != 0){ return true; .原创 2021-09-18 11:09:45 · 124 阅读 · 0 评论 -
力扣算法回溯篇:N皇后
题解:回溯三部曲:1、确定回溯函数的参数 void backtracking(int n,int row,vector<string>& board)2、确定递归终止条件遍历到棋盘最后一层时,收集结果,结束3、确定单层搜索过程for循环控制棋盘列,递归控制棋盘行,遍历放置皇后class Solution {public: vector<vector<string>> result; bool isVaild(int row,i.原创 2021-09-18 10:43:04 · 155 阅读 · 0 评论 -
力扣算法篇:有效的数独
class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { //判断(i,j)处于哪个九宫格 j/3 i%3 //判断是否有重合 //记录某一行是否有重复数字 [i,num] i:某行 num:数字 vector<vector<bool>> row(9,vector<bool&g.原创 2021-09-17 21:22:39 · 250 阅读 · 0 评论 -
力扣算法回溯篇:重新安排行程
题解:回溯三部曲:1、确定回溯函数参数//找到一条有效行程就返回 调用时接收返回值bool backtracking(int ticketNum,vector<string>& result)2、确定递归终止条件回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),就说明找到了一个行程,返回即可3、确定单层搜索过程遍历寻找有效行程,注意判别机场是否飞过了,飞一次航班次数需要–class Solution {public: //unordered_m.原创 2021-09-17 20:33:13 · 314 阅读 · 0 评论 -
力扣算法篇:
题解:class Solution {public: int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; int m = 0; int n = 0; vector<string> result; unordered_set<string> wordsets; void dfs(int i,int j,vector<vector<char>>& bo.原创 2021-09-16 12:26:28 · 154 阅读 · 0 评论 -
力扣算法回溯篇:全排列II
题解:代码随想录图片:依据该图列出如下:回溯三部曲:1、确定回溯函数参数void backtracking(vector<int>& nums,vector<int> used)2、确定递归终止条件当path.size() == nums.size()时,即可停止3、确定单层搜索过程同一树层注意去重,仍然是for循环控制横向遍历,递归控制纵向遍历class Solution {public: vector<vector<int&.原创 2021-09-16 11:02:26 · 133 阅读 · 0 评论 -
力扣算法篇:寻找峰值
题解:class Solution {public: int findPeakElement(vector<int>& nums) { //相邻元素必不相同 int left = 0; int right = nums.size()-1; while(left<right){ int mid = (left+right)/2; //大的那一边一定有峰值 .原创 2021-09-15 10:38:53 · 202 阅读 · 0 评论 -
力扣算法回溯篇:全排列
回溯三部曲:1、确定回溯函数参数需要一个数组标记某元素已经使用过,usedvoid backtracking(vector<int>& nums,vector<int>& used)2、确定递归终止条件当收集元素大小等于nums.size()时,即可停止3、确定单层搜索过程for循环控制横向遍历 但不需要startIndex了,因为排列问题都次都要从头开始搜索,然后仍然是递归控制纵向遍历题解:class Solution {public: .原创 2021-09-15 10:11:59 · 193 阅读 · 0 评论 -
力扣算法篇: 通过删除字母匹配到字典里最长单词
class Solution {public: //某字符串是否可以通过s删除字符得到 bool isCan(string s,string str){ int i = 0; int j = 0; while(i<s.size()&&j<str.size()){ if(s[i] == str[j]){ i++;j++; }else{.原创 2021-09-14 22:36:44 · 81 阅读 · 0 评论 -
力扣算法回溯篇:递增子序列
题解:代码随想录讲解图:可以看到该题需要注意两点:1、去重 是同一父结点下同层不能重复使用2、确保序列是递增序列 所取的值需要大于已有序列的最后一个元素回溯三部曲:1、确定回溯函数的参数void backtracking(vector<int> nums,int startIndex)2、确定递归终止条件startIndex==nums.size时停止3、确定单层搜索过程for循环控制横向遍历 递归纵向遍历 注意去重和收集结果class Solution {pub.原创 2021-09-14 21:53:44 · 123 阅读 · 0 评论 -
力扣算法篇:回旋镖的数量
题解:class Solution {public: //计算每个点到其他点的距离 int dist(vector<int>& p1,vector<int>& p2){ return (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1]); } int numberOfBoomerangs(vector<vector<int>>&am.原创 2021-09-13 11:36:29 · 115 阅读 · 0 评论 -
力扣算法回溯篇:子集II
题解:本题在子集问题的基础上增加了去重class Solution {public: vector<vector<int>> result; vector<int> path; void backtracking(vector<int>& nums,int startIndex){ if(startIndex == nums.size()){ return; } .原创 2021-09-13 10:06:09 · 118 阅读 · 0 评论 -
力扣算法篇:有效的括号字符串
题解:class Solution {public: bool checkValidString(string s) { //括号匹配问题 //*处理: *单独入一个栈 使用序号入栈 为处理*(问题 stack<char> st1; stack<char> st2; //遍历s for(int i = 0;i<s.length();i++){ i.原创 2021-09-12 10:32:43 · 168 阅读 · 0 评论 -
力扣算法回溯篇:子集
题解:回溯三部曲:1、确定回溯函数参数void backtracking(vector<int>& nums,int startIndex)2、确定递归终止条件剩余集合为空时,即停止 ,也即startIndex ==nums.size()时,停止3、确定单层搜索过程for循环控制横向遍历,递归纵向遍历,记录每一个遍历的结点加入结果集class Solution {public: vector<vector<int>> result;.原创 2021-09-12 10:00:28 · 155 阅读 · 0 评论 -
力扣算法篇:不含连续1的非负整数
题解:class Solution {public: int findIntegers(int num) { if(num<2){ return num+1; } //10的9次方 30位可以表示 //f[i] 意为000-111(i个1)中不包含连续1的二进制数的个数 //从左到右依次为第i位 第i-1位 最后是第0位 //考虑高位为0时 000-111(i-1个1) f.原创 2021-09-11 12:23:31 · 146 阅读 · 0 评论 -
力扣算法篇:复原IP地址
题解:回溯三部曲:1、确定回溯函数参数//pointNum 逗点数目void backtracking(string& s,int startIndex,int pointNum)2、确定递归终止条件分割段数达到4时,即逗点数量达到4是,说明字符串分成4段了,验证第四段是否合法,合法则加入结果集。3、确定单层搜索逻辑判断截取的子串是否合法,合法就在字符串后面加上符号’.'表示已经分割,不合法就结束本层循环,递归查看下一个子串(i+2),然后做回溯操作class Solution.原创 2021-09-11 09:52:17 · 201 阅读 · 0 评论 -
力扣算法篇:找到需要补充粉笔的学生编号
题解:class Solution {public: int chalkReplacer(vector<int>& chalk, int k) { //先求得一轮次用的总的粉笔数 long long sum = 0; for(int i = 0;i<chalk.size();i++){ sum+=chalk[i]; } //求余 k = k%sum;.原创 2021-09-10 22:23:56 · 106 阅读 · 0 评论 -
力扣算法篇:分割回文串
题解:回溯三部曲:1、确定回溯函数参数void backtracking(const string& s,int startIndex)2、确定递归函数终止条件起始位置startIndex已经大于s.size(),说明已经找到了一组分割方案,返回3、确定单层搜索逻辑判断截取的子串是不是回文,是则加入结果集,不是则跳过,回溯搜索以i+1为起始位置的子串如下(代码随想录讲解图),便于理解:class Solution {public: vector<vector&.原创 2021-09-10 22:00:24 · 167 阅读 · 0 评论 -
力扣算法篇:文本左右对齐
题解:class Solution {public: //每一行单词平均分配空格 //bg:单词数组中该行开始单词的下标(即该行第一个单词在数组中的下标) // ed:单词数组中该行结束单词的下标(即该行最后一个单词在数组中的下标) string fillWords(vector<string>& words,int bg,int ed,int maxWidth,bool lastLine = false){ //单词数 .原创 2021-09-09 11:34:19 · 161 阅读 · 0 评论 -
力扣算法篇:组合总和II
题解:回溯三部曲:1、确定回溯函数参数void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>& used)2、确定回溯终止条件当当前总和大于目标值时,直接返回,等于目标值时,将数组加入结果集,返回,或者在for循环中增加条件剪枝,则不需要第一个终止条件3、确定单层搜索过程for循环横向遍历 递归纵向遍历,重点在于去重操作,使用u.原创 2021-09-09 10:53:04 · 182 阅读 · 0 评论 -
力扣算法篇:IPO(首次公开募股)
题解:每次选最大 超时class Solution {public: int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) { //n个项目中选k个使得资本最大化 每次在w>=capital[i]中选择纯利润最大的 int n = capital.size(); //用一个数组标志该项目是.原创 2021-09-08 11:17:17 · 207 阅读 · 0 评论 -
力扣算法回溯篇:组合总和
题解:回溯三部曲:1、确定回溯函数参数2、确定回溯终止条件当总和等于目标和时,将该数组加入结果集,返回,当总和大于目标和,直接返回3、确定单层搜索逻辑依然for循环横向遍历,递归纵向遍历,如下(代码随想录讲解图):class Solution {public: vector<vector<int>> result; vector<int> path; void backtracking(vector<int>&.原创 2021-09-08 10:32:11 · 187 阅读 · 0 评论 -
力扣算法篇:分割平衡字符串
题解:class Solution {public: int balancedStringSplit(string s) { //计算通过分割得到的平衡字符串的最大数量 //遍历s int counts = 0; //RL个数相等即分割 使用num变量判断 遇到R则num+1,遇到L则num-1 每次判断num是否为0 为零则counts++ //或理解为括号匹配问题 int num = 0; .原创 2021-09-07 10:41:01 · 169 阅读 · 0 评论 -
力扣算法回溯篇:电话号码的字母组合
题解:回溯三部曲:1、确定回溯函数的参数2、确定回溯终止条件字符串str的size等于所提供数字个数n时3、确定单层搜索过程确定数字对应的字符集,for循环横向遍历当前数字对应的字符串,递归处理下一个数字class Solution {public: vector<string> result; string str; vector<string> letters = {"","","abc","def","ghi","jkl","mno",.原创 2021-09-07 10:25:32 · 176 阅读 · 0 评论 -
力扣算法篇:二分查找(每日一题)
class Solution {public: int search(vector<int>& nums, int target) { //二分查找 int left = 0; int right = nums.size()-1; while(left<=right){ int mid = (left+right)/2; if(nums[mid]==targe.原创 2021-09-06 10:47:29 · 113 阅读 · 0 评论 -
力扣算法回溯篇:组合总和III
题解:回溯三部曲:1、确定回溯函数参数回溯法中的递归函数参数很难一次性确定下来,一般先写逻辑,需要什么参数填什么参数2、确定回溯终止条件当path.size()==k,终止,比较path中的和是否为目标和3、确定单层搜索过程path收集每次选取的元素,相当于树型结构里面的边,sum来统计path元素的总和,注意处理过程和回溯过程一一对应,处理有加,回溯就要有减class Solution {public: //结果集 vector<vector<int>.原创 2021-09-06 10:20:48 · 155 阅读 · 0 评论 -
力扣算法篇:用Rand7()实现Rand()10
题解:// The rand7() API is already defined for you.// int rand7();// @return a random integer in the range 1 to 7class Solution {public: int rand10() { //概率为1/10 得到概率为1/10 int a = rand7(); int b = rand(); //a取值定在1-6 .原创 2021-09-05 10:16:34 · 110 阅读 · 0 评论 -
力扣算法回溯篇:组合(附回溯算法理论基础)
回溯法:搜索的一种方式,回溯是递归的副产品,只要有递归就会有回溯回溯的本质是穷举,穷举所有可能,然后找到我们所需要的答案,为了让回溯法高效一些,可以加一些剪枝的操作回溯法解决的问题:(1)组合问题:N个数里面按一定规则找出k个数的集合(2)切割问题:一个字符串按照一定的规则有几种切割方式(3)子集问题:一个N个数的集合里有多少符合条件的子集(4)排列问题:N个数按一定规则全排列,有几种排列方式(5)棋盘问题:N皇后,解数独等回溯算法模板:void backtracking(参数) {原创 2021-09-05 09:53:50 · 200 阅读 · 0 评论 -
力扣算法篇:斐波那契数列
题解:class Solution {public: int fib(int n) { //斐波那契数列 if(n == 0 || n == 1){ return n; } //动态规划 vector<int> dp(n+1); dp[0] = 0; dp[1] = 1; //计算dp for(int i = 2;i.原创 2021-09-04 12:13:02 · 136 阅读 · 0 评论 -
力扣算法二叉树篇:把二叉搜索树转换为累加树
题解:递归三部曲:1、确定递归函数参数和返回值TreeNode* convertBST(TreeNode* root)2、确定递归终止条件遇空停止3、确定单层递归逻辑根据右中左的遍历顺序,针对中间结点 采用原结点值和前一个新树结点值累加的方式求得新结点值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *.原创 2021-09-04 12:01:36 · 95 阅读 · 0 评论