
力扣个人刷题题解
每做一道题的题解都在这了,或许不是最好的方法,但是肯定是能过的方法,有空的话我还会不断补充新的做法
宋轻云
只有疯子和自律的人,才算活过
展开
-
力扣:64. 最小路径和
1、记忆化搜索状态设计,grid[i][j]表示走到该格最小路径和。状态转移方程, grid[i][j]+=min(grid[i-1][j],grid[i][j-1])class Solution {public: int minPathSum(vector<vector<int>>& grid) { int row=grid.size(); int col=grid[0].size(); fo...原创 2021-11-22 23:22:10 · 428 阅读 · 0 评论 -
力扣:747. 至少是其他数字两倍的最大数
1、遍历一次找到第一第二大的数再进行判断即可class Solution {public: int dominantIndex(vector<int>& nums) { int thesize=nums.size(); int max1=-1,max2=-1,mi=0; for(int i=0;i<thesize;++i) { if(nums[i]>max1) ...原创 2021-11-22 20:56:02 · 632 阅读 · 0 评论 -
力扣:75. 颜色分类
1、来个简简单单的冒泡排序class Solution {public: void sortColors(vector<int>& nums) { int thesize=nums.size(); for(int i=0;i<thesize-1;++i) { bool sign=true; for(int j=thesize-1;j>i;--j) ...原创 2021-11-22 20:38:24 · 646 阅读 · 0 评论 -
力扣:292. Nim 游戏
1、经典的巴什博弈这里解释一下为什么是这样的因为一次可以拿1~3颗,而且每个人都想赢。那么如果n为4的倍数,那不管先手的拿多少个,后手的都可以拿一定数量的石子,使得剩余的石子依旧是4的倍数,比如先手拿2个,那么后手可以也拿两个,此时剩余的石子为n-4,且4|(n-4),所以最终必然是后手赢。当n不是4的倍数时,先手则可以通过取走一定量的石子使得剩余的石子变成4的倍数,然后和上面同理,接下来无论后手怎么拿,先手都可以通过拿一定数量的石子使得剩余的石子为4的倍数,所以最后必然是先手赢...原创 2021-11-21 22:05:03 · 3203 阅读 · 0 评论 -
力扣:300. 最长递增子序列
1、首先,用一个数组mins去记录各个长度子序列的最小结尾数。用cnt记录mins的最大下标,也就是当前最长子序列的长度减一;那么一开始肯定有cnt=0,mins[0]=nums[0];然后去遍历数组nums,在数组mins中用二分找到大于等于nums[i]的数的最小值,然后替换它,如果找到的数为mins数组中最后一个数mins[cnt],且nums[i]>mins[cnt],则mins[++cnt]=nums[i]。也就是最长的子序列长度加一,因为nums[i]比当前最长的...原创 2021-11-21 20:51:07 · 527 阅读 · 2 评论 -
力扣:63. 不同路径 II
1、由于它有障碍,并且障碍在数组中表示为1,那么我们可以用每个格obstacleGrid[i][j]去存储走到当前格的路径数加一,那么要得到路径数,只要将格子中的数减一即可,而有障碍的格子中的数为1,减去1则为0,所以不再影响递推的结果。先初始化第一行和第一列,从开始位置到遇到边界或者遇到障碍之间的格子都填充2,因为只能往右往上走,所以都只有一条路径到达这里,如果遇到障碍,那么障碍后的所有格子填充1,表示到达这些格子的路径数为0;然后根据状态转移方程:obstacleGrid[i][j]=...原创 2021-11-21 19:54:57 · 266 阅读 · 0 评论 -
力扣:62. 不同路径
1、用nums[i][j]表示到达格子(i,j)的路径数。由于机器人只能向下或者向右走,所以有状态转移方程nums[i][j]=nums[i-1][j]+nums[i][j-1]进行初始化,nums[0][j]和nums[i][0]均为1;优化,降维,因为每次状态转移只用到了上一行同列的数和同行上一列的数,所以可以用一个一维数组表示,降维后状态转移方程为nums[i]=nums[i]+nums[i-1]class Solution {public: int unique...原创 2021-11-20 23:22:51 · 266 阅读 · 0 评论 -
力扣:876. 链表的中间结点
1、简单做法先求链表长度,然后求出中点,返回中间结点即可。/** * 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 ...原创 2021-11-20 23:05:53 · 414 阅读 · 0 评论 -
力扣:21. 合并两个有序链表
1、另开链表的做法/** * 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) : v...原创 2021-11-20 22:57:25 · 223 阅读 · 0 评论 -
力扣:1721. 交换链表中的节点
1、双指针做法先求出链表长度,再分别找到要交换值的结点。/** * 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...原创 2021-11-20 22:39:18 · 111 阅读 · 0 评论 -
力扣:面试题 02.04. 分割链表
1、双指针做法用big指针找到第一个大于或等于x的结点,然后从big所指结点去寻找第一个小于x的结点然后交换两个结点的值,以此类推。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {pu...原创 2021-11-20 22:14:27 · 117 阅读 · 0 评论 -
力扣:面试题 02.02. 返回倒数第 k 个节点
1、双指针做法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: int kthToLast(ListNode* head, int k) { ListNode..原创 2021-11-20 22:02:42 · 219 阅读 · 0 评论 -
力扣:61. 旋转链表
1、简单做法(勉强算双指针吧)/** * 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 *ne...原创 2021-11-20 21:50:37 · 104 阅读 · 0 评论 -
力扣:24. 两两交换链表中的节点
1、简单做法,双指针注意点:①注意链表头的位置,因为第一个结点和第二个结点转换后应该以第二个结点为头②注意前一次转换与后一次转换之间不是互相独立的,所以得注意他们之间的关系③注意没有或仅一个结点的特殊情况。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nu...原创 2021-11-20 21:23:57 · 412 阅读 · 0 评论 -
力扣:42. 接雨水
1、超时双指针做法class Solution {public: int trap(vector<int>& height) { int thesize=height.size(); int cnt=0,l=0,r=thesize-1; while(l<r) { while(l<r&&height[l]==0) ++l; ...原创 2021-11-20 20:54:48 · 453 阅读 · 3 评论 -
力扣:45. 跳跃游戏 II
1、分析题目,由于要求跳跃次数最少,那就说明了要尽量使每次跳跃的目的位置为所能跳跃的范围最大的位置。一开始从下标为0开始跳,那么每次跳跃前得先判断当前位置所能跳到的所有位置的跳跃极限。比如,一个数组 2,3,1,4,5,6那么一开始nums[0]为2,那他可以跳到数字3和数字1那里,那么跳到数字3还是跳到数字1更好呢,那么就要先比较比较。如果跳到数字3,那么它下一次跳跃的范围将是数字1到数字5,而如果跳到数字1,那么它下一次跳跃只能到数字4,所以跳到数字3的话下一次跳跃的范围包括了...原创 2021-11-20 20:06:26 · 2715 阅读 · 0 评论 -
力扣:55. 跳跃游戏
·1、简单做法class Solution {public: bool canJump(vector<int>& nums) { int thesize=nums.size(); int max=0; bool* can=new bool[thesize]; memset(can,0,thesize*sizeof(bool)); can[0]=1; for(int ...原创 2021-11-19 23:45:03 · 2822 阅读 · 0 评论 -
力扣:11. 盛最多水的容器
1、简单做法,分别从两端去找比它大的第一个点,并且在寻找的过程中做一定的限制。class Solution {public: int maxArea(vector<int>& height) { int thesize=height.size(); int max=0,other; for(int i=0;i<thesize;++i) { other=thesize-1...原创 2021-11-19 22:24:44 · 503 阅读 · 0 评论 -
力扣:1227. 飞机座位分配概率
1、其实这道题有点小巧妙首先排除特殊情况,只有一位乘客,此时,他只能坐自己的位置,所以返回1。如果第一位乘客坐了自己的位,那么由题意可以知道第n位乘客必然是能坐在自己的座位上。现在再来看第一位乘客坐错了位置。那么我们可以认为第一位乘客所坐的就是第二位乘客的位置。或许有人问,为什么呢?这里解释一下。如果第一位乘客坐的是第三位乘客的位置,那么第二位乘客就必然能坐在自己的位置上,此时第二位乘客的存在与结果之间没有任何联系,那么我们是否就可以假设没有这第二位乘客和他的那个位置呢?答...原创 2021-11-19 21:34:45 · 740 阅读 · 0 评论 -
力扣:1332. 删除回文子序列
1、由于它只有两种字符,所以最多只能是二次,所以其实就是判断是不是回文字符串的问题,是则返回1,不是则返回2.class Solution {public: int removePalindromeSub(string s) { int i=0,j=s.size()-1; while(i<j) { if(s[i]!=s[j]) return 2; else ...原创 2021-11-15 22:37:43 · 307 阅读 · 0 评论 -
力扣:剑指 Offer II 019. 最多删除一个字符得到回文 或 680. 验证回文字符串 Ⅱ
1、暴力做法,直接判断class Solution {public: bool validPalindrome(string s) { int i=0,j=s.size()-1; while(i<j) { if(s[i]!=s[j]) { if(s[i+1]!=s[j]&&s[i]!=s[j-1]) return false;...原创 2021-11-15 22:27:32 · 218 阅读 · 0 评论 -
力扣:面试题 01.04. 回文排列
1、哈希表做法class Solution {public: bool canPermutePalindrome(string s) { int cnt=0; int hash[256]={0}; for(int i=0;s[i];++i) ++hash[s[i]]; for(int i=0;i<256;++i) if(hash[i]&1) ++cnt; if(cnt>1) return ..原创 2021-11-15 21:40:45 · 248 阅读 · 0 评论 -
力扣:345. 反转字符串中的元音字母
1、双指针做法class Solution {public: string reverseVowels(string s) { int i=0,j=s.size()-1; while(i<j) { while(i<j&&s[i]!='a'&&s[i]!='e'&&s[i]!='i'&&s[i]!='o'&&s[i]!='u'&..原创 2021-11-14 19:38:27 · 395 阅读 · 0 评论 -
力扣:2000. 反转单词前缀
1、二指针做法class Solution {public: string reversePrefix(string word, char ch) { int i,j=0; char tmp; for(i=0;word[i];++i) if(word[i]==ch) break; if(word[i]=='\0') return word; else { ...原创 2021-11-14 19:24:35 · 451 阅读 · 0 评论 -
力扣:1832. 判断句子是否为全字母句
1、哈希表做法class Solution {public: bool checkIfPangram(string sentence) { bool hash[26]={0}; for(int i=0;sentence[i];++i) hash[sentence[i]-'a']=true; for(int i=0;i<26;++i) if(!hash[i]) return false; return true;...原创 2021-11-13 20:19:19 · 233 阅读 · 0 评论 -
力扣:剑指 Offer II 032. 有效的变位词
1、哈希表做法class Solution {public: bool isAnagram(string s, string t) { if(s.size()!=t.size()) return false; bool flag=false; int hash[26]={0}; for(int i=0;s[i];++i) if(s[i]!=t[i]) { ...原创 2021-11-13 20:15:09 · 207 阅读 · 0 评论 -
力扣:面试题 01.02. 判定是否互为字符重排
1、哈希表做法class Solution {public: bool CheckPermutation(string s1, string s2) { if(s1.size()!=s2.size()) return false; int hash[256]={0}; for(int i=0;s1[i];++i) { ++hash[s1[i]]; --hash[s2[i]];..原创 2021-11-13 20:07:54 · 101 阅读 · 0 评论 -
力扣:1784. 检查二进制字符串字段
1、不大懂这题目的意思,大概就是全部'1'都要连在一起则返回true,否则返回false,而且它第一位必然是'1'。class Solution {public: bool checkOnesSegment(string s) { for(int i=1;s[i];++i) { if(s[i]=='1'&&s[i-1]=='0') return false; } return ...原创 2021-11-12 21:09:54 · 232 阅读 · 0 评论 -
力扣:1816. 截断句子
1、用cnt去记录空格数,每个空格代表有一个单词。class Solution {public: string truncateSentence(string s, int k) { int cnt=0,i=0,thesize=s.size(); char* news=new char[thesize+1]; while(s[i]) { news[i]=s[i]; if(...原创 2021-11-12 20:51:33 · 177 阅读 · 0 评论 -
力扣:2042. 检查句子中的数字是否递增
1、声明tmp1和tmp2去记录前后两个数。然后去遍历数组读取其中的数字即可。class Solution {public: bool areNumbersAscending(string s) { int i=0,tmp1=0,tmp2=0,thesize=s.size(); while(i<thesize) { if(s[i]<='9'&&s[i]>='0') ...原创 2021-11-12 23:00:05 · 126 阅读 · 0 评论 -
力扣:2057. 值相等的最小索引
1、简单做class Solution {public: int smallestEqual(vector<int>& nums) { int thesize=nums.size(); for(int i=0;i<thesize;++i) if(i%10==nums[i]) return i; return -1; }};原创 2021-11-12 23:01:18 · 107 阅读 · 0 评论 -
力扣:LCP 06. 拿硬币
1、超级简单,就是每次尽可能拿两个,拿不了两个就拿一个。class Solution {public: int minCount(vector<int>& coins) { int sum=0,thesize=coins.size(); for(int i=0;i<thesize;++i) { if(coins[i]&1) sum+=coins[i]/2+1; else..原创 2021-11-12 23:01:30 · 148 阅读 · 0 评论 -
力扣:961. 重复 N 次的元素
1、简单做,排序,寻找相同的数。class Solution {public: int repeatedNTimes(vector<int>& nums) { int thesize=nums.size(); sort(nums.begin(),nums.end()); for(int i=1;i<thesize;++i) if(nums[i]==nums[i-1]) return nums[i]; ...原创 2021-11-12 23:02:02 · 384 阅读 · 0 评论 -
力扣:551. 学生出勤记录 I
1、按题目要求判断即可,用acnt记录A的个数,用lcnt记录连续L的个数。class Solution {public: bool checkRecord(string s) { int acnt=0,lcnt=0; for(int i=0;s[i];++i) { if(s[i]=='A') { ++acnt; if(ac...原创 2021-11-12 23:02:16 · 82 阅读 · 0 评论 -
力扣:111. 二叉树的最小深度
1、深度优先搜索做法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), rig...原创 2021-11-12 23:02:50 · 838 阅读 · 0 评论 -
力扣:104. 二叉树的最大深度
1、深度优先搜索做法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(..原创 2021-11-12 23:03:03 · 830 阅读 · 0 评论 -
力扣:674. 最长连续递增序列
1、用cnt记录当前连续递增的长度,max记录当前最大的连续递增长度,迭代一遍数组即可。class Solution {public: int findLengthOfLCIS(vector<int>& nums) { int max=0,cnt=1,thesize=nums.size(); for(int i=1;i<thesize;++i) { if(nums[i]>nums[i-...原创 2021-11-12 23:03:16 · 86 阅读 · 0 评论 -
力扣:面试题 16.05. 阶乘尾数
1、由于每个尾数0肯定都是一个2*5得来的,所以我们只要考虑n的阶乘中有多少个5即可,因为每个偶数肯定带一个2,所以必然有足够的2去乘5,所以我们只要计算5的个数即可。首先n/5表示,n中有多少个数能被5整除。n/25表示,n中有多少个数能被25整除,由于25中有两个5,而在n/5中这些数已经被计算了一次,所以n/25当做一次即可,以此类推。class Solution {public: int trailingZeroes(int n) { int num...原创 2021-11-11 09:24:27 · 329 阅读 · 0 评论 -
力扣:1015. 可被 K 整除的最小整数
1、首先,唯有偶数和5的倍数不存在这样的N,所以先判断K不为这两种数,再用二分快速幂去求余即可。class Solution {public: int smallestRepunitDivByK(int k) { if(k==1) return 1; else if(!(k&1)) return -1; else if(k%5==0) return -1; int cnt=0; int sum=0; w...原创 2021-11-11 08:40:33 · 324 阅读 · 0 评论 -
力扣:LCP 01. 猜数字
1、不要太简单class Solution {public: int game(vector<int>& guess, vector<int>& answer) { int sum=0; for(int i=0;i<3;++i) if(guess[i]==answer[i]) ++sum; return sum; }};原创 2021-11-11 09:37:32 · 117 阅读 · 0 评论