摘要:69. x 的平方根 简单题,但是考察的内容可以有很多 首先是纯暴力法,毫无特色。速度也很慢。 class Solution { public: int mySqrt(int x) { long long i=1; while(1) { if(i*i<=x) i++; else break; } r
阅读全文
摘要:169. 多数元素 这道题虽然是简单题,但是有很多精妙的解法。详情看官方题解 class Solution { public: int majorityElement(vector<int>& nums) { int size=nums.size(); if(size<=2) return nums
阅读全文
摘要:977. 有序数组的平方 原本直接暴力的做法没有利用到原数组是有序这个条件。这里直接把左边的绝对值大于右边的直接放到最后面,这样就减少很多不必要的操作。 class Solution { public: vector<int> sortedSquares(vector<int>& nums) { i
阅读全文
摘要:131. 分割回文串 这是看了卡尔的代码写出来的 class Solution { public: int size; vector<vector<string>> res; vector<string> path; bool isHuiwen(string s,int start,int end)
阅读全文
摘要:40. 组合总和 II 这题和 39. 组合总和 差不了多少。区别就是这一题提供的集合内有重复元素,而上一题没有重复元素。因为有重复元素,所以输出的结果里不能有重复的中间结果。 class Solution { public: int size,sum=0; vector<vector<int>>
阅读全文
摘要:39. 组合总和 首先是原始的错误代码 class Solution { public: int size,sum=0; vector<vector<int>> res; vector<int> path; void backTracking(vector<int>& candidates, int
阅读全文
摘要:回溯法抽象为树形结构后,其遍历过程就是:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。
阅读全文
摘要:17. 电话号码的字母组合 这题还是看了题解才写出来。一开始不懂得每一层递归处理不同数字对应的字母,又想一些二维数组的操作,就搞复杂了。 题中的index就代表当前正在处理第几个数字对应的字母,循环中,压入这个之后就轮到下一个数字的对应字母,最后再返回。 想这种不知道会输入多少个数字的最好的方法就是
阅读全文
摘要:216. 组合总和 III 有了 77. 组合 的启发后,就成功地自己写了通过的代码 class Solution { public: vector<vector<int>> res; vector<int> path; int sum=0; void combineSum(int k,int n,
阅读全文
摘要:77. 组合 class Solution { public: vector<vector<int>> res; vector<int> path; void backTracking(int n,int k,int startIndex) { if(path.size()==k) { res.pu
阅读全文
摘要:198. 打家劫舍 这道题在纸上模拟还是很容易的,但是写代码就不同了。第一次写认为的难点是如何找到当前元素除了上一个之外的最大值。于是我想到了用max1保存第二大的下标,max2保存第二大的下标。 全程写下来还是挺顺的,但是中间有几步dp[i]写成了nums[i]一直没发现就调试了很久。 写的时候没
阅读全文
摘要:int mid = begin +(end - begin)/2; 不要用int mid = (end + begin)/2; 会越界
阅读全文
摘要:1047. 删除字符串中的所有相邻重复项 方法一:stack 这种做法是纯纯的小丑做法,因为string类型本身就可以实现栈。这样的做法结束之后还要出栈倒序放到字符串里,时间开销很大。 class Solution { public: string removeDuplicates(string s
阅读全文
摘要:104. 二叉树的最大深度 这道题用递归法还是很容易的,递归的关键在于停止条件、递归函数和返回值处理。 方法一:DFS /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;
阅读全文
摘要:21. 合并两个有序链表 方法一:递归 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {}
阅读全文
摘要:237. 删除链表中的节点 方法一:不断赋值,最后的那个指向NULL。这种方法有点想数组插入,没有充分利用链表的性质 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *
阅读全文
摘要:328. 奇偶链表 首先是原始的错误代码。 第一处错误就是最后的p->next=head->next; head->next其实早就不是一开始的第二个结点了,所以应该是事先保存的第二个结点 第二处错误就是while循环里的代码,不知道是什么原因出错 /** * Definition for sing
阅读全文
摘要:142. 环形链表 II 方法一:快慢指针 先通过快指针和慢指针判断是否有环,无环则返回NULL. 有环: 概括来说就是:f 代表快指针走了几步,s 代表慢指针走了几步。则有 f = 2s ; f = s + nb ; (b代表环的结点个数,n代表快指针比慢指针多走几个环的长度) 两式联立得,f =
阅读全文
摘要:141. 环形链表 方法一:快慢指针,如果存在环,快指针总会追上慢指针的。如果不存在环,那么遇到NULL就会直接结束 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *
阅读全文
摘要:19. 删除链表的倒数第 N 个结点 方法一:快慢指针法 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nul
阅读全文
摘要:203. 移除链表元素 这里的做法是遍历找到需要删除的结点的前一个结点,但由于题目没有给出头结点,所以就有先删除开头符合条件的结点和设置虚拟头结点两种做法 一、释放内存free和delete的区别: 1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间 2.
阅读全文
摘要:leetcode119. 杨辉三角 II有感
阅读全文
摘要:https://leetcode.cn/problems/remove-element/ 首先是自己想的铸币解法。先进行排序,那么目标数字就连续聚在一起。等快指针移动到最后一个目标值得下一个元素就开始进行赋值操作。然后快指针和慢指针不断同步地右移进行赋值操作,直到快指针移动到最后一个元素,两个指针都
阅读全文
摘要:https://leetcode.cn/problems/longest-palindrome/ 要生成最长回文串,所有出现了偶数次的字母都要添加。出现奇数次的字母就要添加出现次数最多的那个字母,其余出现次数非1的奇数次字母则添加 n-1 个 bool类型flag是用来标记是否已经添加最大奇数字母。
阅读全文
摘要:https://leetcode.cn/problems/diagonal-traverse/ 一开始看到题目的想法是,每个矩阵都要用for循环遍历m+n-1次对角线,然后遍历对角线上的元素,后来感觉太麻烦便放弃。 然后就想到通过一个bool类型的变量控制遍历方向是从右上还是左下,true代表右上,
阅读全文
摘要:https://leetcode.cn/problems/rotate-image/ 方法一:额外开一个新数组 class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); //
阅读全文
摘要:https://leetcode.cn/problems/merge-strings-alternately/ 这题没什么好说的,特别简单。但是也学到了一些点。 1.字符串res和另一个字符串中的某一个字符nums[i]不能通过 res += nums[i];形式添加,否则会报错。要用 res =
阅读全文
摘要:https://leetcode.cn/problems/move-zeroes/ 方法一:双指针法 设置两个指针 i 和 j , 1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) { 4 int i,j,size=n
阅读全文
摘要:https://leetcode.cn/problems/sum-of-all-odd-length-subarrays/ 虽然知道几个嵌套循环暴力可以做,但是可以明显看出每一次都要经过很多重复计算,数组中每一个数字相加的次数是不同的,于是尝试看看相加的次数有什么规律。 其中大小为5的数组相加次数分
阅读全文
摘要:https://leetcode.cn/problems/next-greater-element-i/ 方法一:暴力 vector<int> res;int size1=nums1.size(),size2=nums2.size(); for(int i=0;i<size1;i++) { int
阅读全文
摘要:int count=0,sizes=s1.size(),sum1=0,sum2=0; for(int i=0;i<sizes;i++) { if(s1[i]!=s2[i]) count++; sum1 += s1[i]; sum2 += s2[i]; } if((count==2||count==0
阅读全文
摘要:百度百科:快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 判断单链表是否为循环链表 让快慢指针从链表头开始遍历,快指针向前移动两个位置,慢指针向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,不是循环链表。
阅读全文
摘要:https://leetcode.cn/problems/happy-number/ 一开始的错误代码 int sum; if(n==1) return true; while(n>9) { sum=0; while(n) { sum += (n%10)*(n%10); n /= 10; } if(
阅读全文
摘要:我的原始代码 class Solution { public: bool canMakeArithmeticProgression(vector<int>& arr) { sort(arr.begin(),arr.end()); int sizes=arr.size(),n=arr[1]-arr[0
阅读全文
摘要:1.循环检查二进制位 把题目给出的数不断对2取余,余数为1则计数 class Solution { public: int hammingWeight(uint32_t n) { int count=0; while(n) { if(n%2==1) count++; //还可以直接化简为count+
阅读全文
摘要:第一反应是排序,然后瞎想了很多什么双指针、三指针的东西。看了评论区才豁然开朗。 “ 为什么排序遍历相邻元素可行,有没有可能最优解为非相邻元素?(不会) 证明:反证 假设 a , b, c 为最优解,且存在a',b',满足 a < a' < b < b' < c(存在非相邻元素) 由于 a + b >
阅读全文