力扣
小昊☆
这个作者很懒,什么都没留下…
展开
-
centos 7 安装mysql
首先 在这里 找到合适的版本Red Hat Enterprise Linux 7然后复制下载链接,使用wget命令下载wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm安装下载的 .rpm文件yum -y install mysql80-community-release-el7-5.noarch.rpm安装mysql服务器yum -y install mysql-community-ser原创 2022-02-17 10:57:13 · 482 阅读 · 0 评论 -
力扣双指针
977. 有序数组的平方easy想到了使用双指针从左右开始实现非严格降序排列,却没转过弯来——先建立一个与原数组等大的数组倒着放入元素就实现了非严格升序排列了189. 旋转数组medium这个主要是判断要把前几个元素分别作为起点才能实现旋转全覆盖283. 移动零easy这个easy的题好像也没有那么easy注意下面的注释class Solution {public: void moveZeroes(vector<int>& nums) { in.原创 2021-07-24 22:42:41 · 63 阅读 · 0 评论 -
二分查找题目
704. 二分查找easy典型的二分查找,主要学习了更简洁高效的代码写法class Solution {public: int search(vector<int>& nums, int target) { int right=nums.size()-1; int left=0; while(left<=right){ int cur=left+(right-left)/2;原创 2021-07-22 19:44:25 · 179 阅读 · 0 评论 -
1014. 最佳观光组合mediu
链接一道智力题很明显两次遍历可以求解,也很明显,这样肯定会超出时间限制。思路:观察表达式,i<j,遍历时,对于每个元素j,values[j]-j是不变的,所以只要找出小于j的元素i中values[i]+i值最大的即可,而这个值在我们遍历时可以维护class Solution {public: int maxScoreSightseeingPair(vector<int>& values) { int sz=values.size();原创 2021-07-14 13:55:39 · 61 阅读 · 0 评论 -
力扣动态规划题目
198.打家劫舍(medium) 状态:dp[i][0]:没偷第i家的最多钱 dp[i][1]:偷了第i家时的最多钱 选择:不偷第i家:dp[i][0]=max(dp[i-1][0],dp[i-1][1]) 偷第i家:dp[i][1]=dp[i-1][0]+nums[i]注意到第i家仅与i-1家有关,所以可以只用2*2的数组class Solution {public: int rob(vector<int>& nums) {原创 2021-07-10 23:30:47 · 233 阅读 · 0 评论 -
62. 不同路径 medium
第一次尝试思路:递归代码:class Solution {public: int path(int curm,int curn,int m,int n){ if(curm<m&&curn<n) return 1+path(curm+1,curn,m,n)+path(curm,curn+1,m,n); else return 0; } in原创 2021-07-08 21:59:31 · 47 阅读 · 0 评论 -
73. 矩阵置零medium
73. 矩阵置零自己想到了可是使用额外的O(m+n)空间来存储对应的m行或者n列是否含有0,但是想不到只用常数空间解决问题。题解思路是使用原数组第一行和第一列标记此行或此列是否含有n,这样会覆盖第一行和第一列原来的数据,所以在第一次遍历获取标记之前使用两个值来记录第一行第一列本来是否含有零。因为必须要先找到含有零的行和列,最后一起处理,所以要两次遍历,时间复杂度O(mn)空间复杂度O(1)class Solution {public: void setZeroes(vector<v原创 2021-06-15 20:16:18 · 75 阅读 · 0 评论 -
15. 三数之和medium
https://leetcode-cn.com/problems/3sum/一开始想到了两数之和的做法,利用map,可以在时间复杂度O(N^2)的条件下完成,但是没有写,感觉很麻烦。。。果然后来看了一些分析,判断不能出现重复项是一件很麻烦的事情。。。这道题最大的收获感觉就是或许可以尝试使用stl中一些算法,比如sort大体应该是使用快速排序完成的,平均时间复杂度是O(nlogn),是比O(N^2)快的。在排序后,使用双指针(三指针)。类似于两数之和中利用map的做法。class Solution {原创 2021-06-14 20:00:48 · 57 阅读 · 0 评论 -
70. 爬楼梯easy
https://leetcode-cn.com/problems/climbing-stairs/思路:到第n(n>2)阶有两种方法,从n-1阶上来,从n-2阶上来,很自然的想到了递归,然而当n=43就超时了(递归的时间复杂度是O(2^n)后想用迭代实现class Solution {public: int climbStairs(int n) { if(n==1) return 1; vector<int>nums(原创 2021-06-11 09:39:01 · 45 阅读 · 0 评论 -
88. 合并两个有序数组easy
https://leetcode-cn.com/problems/merge-sorted-array/还是挺简单的,可以直接合并然后sort,也可以另开辟数组利用双指针填充然后复制到nums1当然,最好是三指针,很开心自己马上就想到这种方法了方法:从后向前填充nums1,不用额外开辟空间class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2,原创 2021-06-10 13:39:00 · 49 阅读 · 0 评论 -
278. 第一个错误的版本easy
https://leetcode-cn.com/problems/first-bad-version/submissions/使用二分法查找,整体思路挺简单的,只是有两个点要注意第一是,临界值,要注意每次left与right的调整,当mid是true时,不能确定mid是否是第一个错误的,所以使right=mid,而mid是false时,可以确定mid及其左侧所有值都不是第一个错误的,所以使left=mid+1第二是,在计算mid时,若使用(left+right)/2可能会发生溢出,可以使用类型转换,用原创 2021-06-09 21:33:27 · 56 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树easy
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/想到了每次取中间值作为根节点的值递归求整棵树,但是边界判断问题没有理清楚,看了看答案,很简单两个边界作为参数,若left>right返回空指针递归时左子树取left,mid-1,右子树取mid+1,right即可class Solution {public: TreeNode* sortedArrayToBST(vector&l原创 2021-06-08 17:59:04 · 54 阅读 · 0 评论 -
102. 二叉树的层序遍历medium
震惊,竟然直接就把medium敲出来了感觉不难,就是bfs使用队列,利用oldnum记录本层元素个数,newnum记录下一层元素个数class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; if(!root) return result;原创 2021-06-07 19:56:41 · 45 阅读 · 0 评论 -
101. 对称二叉树easy
又是被简单题折磨的一天时空复杂度都是O(n)我一开始想的迭代:利用栈类似中序遍历比较,但是有很多特殊情况判断错误,所以提交了好多次,缝缝补补加了很多条件判断才成功class Solution {public: bool isSymmetric(TreeNode* root) { stack<TreeNode*>stackl; stack<TreeNode*>stackr; TreeNode*pl=root->lef原创 2021-06-05 11:38:13 · 62 阅读 · 0 评论 -
98. 验证二叉搜索树
一开始:我认为递归判断使得左子树<节点<右子树的值即可。然而可能存在根节点的右子树的左子树的值比根节点小的情况。又想了一会,无果,只能中序遍历存储在vector中然后判断是否为升序排列class Solution {public: void func(TreeNode*root,vector<int>&values){ if(root){ func(root->left,values); v原创 2021-06-04 18:06:08 · 61 阅读 · 0 评论 -
104. 二叉树的最大深度easy
昨天第一眼看上去还懵懵的,可能也是因为没有仔细思考吧。昨晚大体看了一下DFS的思路,应该是管用的,今天五分钟就AC了虽然代码还是有点冗余class Solution {public: int height(TreeNode*t){ if(!t) return 0; return max(height(t->left),height(t->right))+1; } int maxDepth(TreeNode*原创 2021-06-04 16:00:12 · 47 阅读 · 0 评论 -
141. 环形链表easy
方法一:哈希表(判断是否有重复元素)此问题中重复元素指链表元素的地址class Solution {public: bool hasCycle(ListNode *head) { unordered_set<ListNode*> seen; while(head){ if(seen.count(head)) return true; seen.insert(head);原创 2021-05-31 21:33:21 · 68 阅读 · 0 评论 -
234. 回文链表easy
方法一:遍历链表,将元素放入数组中,然后使用双指针判断时间复杂度:O(n)空间复杂度:O(n)方法二:递归递归,使得尾指针先到达链表尾部,然后依靠其返回顺序与头指针比较,相当于实现了尾指针从后向前与从前向后的头指针比较。时间复杂度O(n)空间复杂度O(n)class Solution {public: ListNode*front; bool rcheck(ListNode*current){ if(current){ if(!rch原创 2021-05-31 20:44:36 · 48 阅读 · 0 评论 -
21. 合并两个有序链表easy
方法一:迭代我的源代码class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(!l1) return l2; if(!l2) return l1; ListNode*head; if(l1->val>l2->val){ head=原创 2021-05-30 22:10:53 · 52 阅读 · 0 评论 -
206. 反转链表easy
自己首先用迭代写出来了,然后看了官方的写了一遍,发现没有理解透,又看了一遍写了一下class Solution {//第一遍public: ListNode* reverseList(ListNode* head) { if(!head) return head; ListNode *dummy=new ListNode(0,head); ListNode*l=dummy,*r=head->next,*tail=hea原创 2021-05-29 18:18:13 · 48 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点 medium
想到了双指针(感觉做到现在就记住了个双指针的方法),但是头结点就是第一个节点,也就是第一个节点是没有前驱的,就很难受(和课上学的不太一样)。然后条件判定写了半天,快慢指针中间到底隔着多少判定了很久,class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* r=head,*l=head; int count=0; while(r->原创 2021-05-28 22:08:17 · 62 阅读 · 0 评论 -
237. 删除链表中的节点easy
想了一个小时想出了两行代码。。class Solution {public: void deleteNode(ListNode* node) { node->val=node->next->val; node->next=node->next->next; }};没有头结点,所以找不到被删节点的前驱,只能用下一节点给当前节点赋值,就把下一个节点从链表中删除了,相当于删除了目标节点离谱...原创 2021-05-28 21:15:42 · 41 阅读 · 0 评论 -
14. 最长公共前缀easy
首先想到了纵向扫描,也确实是这样实现的思路即比较每个字符串对应位置字符是否相等。这种方法应该是最容易想到的,反正就是暴力求解class Solution {public: string longestCommonPrefix(vector<string>& strs) { int sz=strs.size(); if(sz==0) return ""; if(sz==1) re原创 2021-05-27 20:28:59 · 83 阅读 · 0 评论 -
38. 外观数列 竟然是medium
就硬刚打表,反正就30个笑死调用函数即可class Solution {public: string fun(const string s){//返回给定数组的信息 int sz=s.size(); string result=""; int count=1; for(int i=0;i<sz;){ while(i<sz-1&&s[i+1]==s[i]){原创 2021-05-27 19:29:53 · 72 阅读 · 0 评论 -
28. 实现 strStr() easy
首先想到的是KMP,但是…所以暴力求解但是情况未考虑全面漏掉了以下两点1.原字符串长度小于目标字符串2.字母重用比如"ississipl",“issip”缝补了一下代码class Solution {public: int strStr(string haystack, string needle) { int szh=haystack.size(),szn=needle.size(); if(szn==0) return 0;原创 2021-05-27 18:56:37 · 39 阅读 · 0 评论 -
8.字符串转换整数medium
这道题我的一开始的思路就是逐个字符判断,对于溢出,利用2147483648/10与当前数字的大小关系比较来判断是否溢出。后来题目描述里有字符“.”,我以为还要进行小数的有关操作,但是题解中似乎并没有涉及。官方题解中给了状态机的描述,对这个名词接触不多,感觉很巧妙,特别是题解代码中利用map存储状态这一操作但是似乎if-else也能解决还有就是关于溢出判断,官方题解利用longlong类型来进行判断,不失为一种好的思路...原创 2021-05-26 21:25:52 · 37 阅读 · 0 评论 -
125.验证回文串easy
方法很简单双指针即可,主要是之前不知道判断字符是否是字母和数字的API,而且不知道转换大小写的,所以自己写了半天的转化。class Solution {public: bool isPalindrome(string s) { int l=0,r=s.size()-1; for(;l<r;++l,--r){ while((s[l]<'0'||(s[l]>'9'&&s[l]<'A')||(s[l]>原创 2021-05-26 20:43:18 · 67 阅读 · 0 评论 -
242.有效的字母异位词easy
啪的一下,很快啊,就是没通过。。没考虑到t.size()<s.size()的情况如s=“ab”,t=“a”class Solution {public: bool isAnagram(string s, string t) { if(s.size()!=t.size()) return false; map<char,int> words; for(auto i:s) ++wor原创 2021-05-26 20:14:35 · 40 阅读 · 0 评论 -
387字符串中的唯一字符easy,
又是瞥到了标签——哈希表然后看看·想到题目,“不重复”,用map试试两次for循环遍历,第一遍将字符映射到哈希表中,第二遍找第一个mapped_type为1的就好class Solution {public: int firstUniqChar(string s) { map<char,int>charmap; for(int i=0;i<s.size();++i){ ++charmap[s[i]];原创 2021-05-25 20:32:22 · 88 阅读 · 0 评论 -
344.反转字符串easy
应该是有了之前做数组的一点点经验,很自然的想到了双指针,不过,很简单的代码改了好几遍。。。。。class Solution {public: void reverseString(vector<char>& s) { vector<char>::size_type sz=s.size(); if(sz==0) return; for(int i=0,j=sz-1;i<j;++i,--j){原创 2021-05-25 20:01:09 · 49 阅读 · 0 评论 -
36.有效的数组medium
遍历一次,同时将每一行,每一列,每一个3*3方格的数字分别保存在三个二维数组中,若遍历时发现有相同的就返回false方格表示:0,1,23,4,56,7,8可以看出来i,j双for循环遍历时box行号为(i/3)*3+j/3class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { vector<vector<int>> ro原创 2021-05-24 19:28:59 · 104 阅读 · 0 评论 -
1.两数之和easy
第二次把这道题解出来上次知识两次for循环遍历求解,还是看了答案之后才写出来的这次看到就知道可以暴力求解了,但除了这个是没有别的思路的,然后瞟到了标签“哈希表”,用map?可以的方法遍历,同时建立map<int,int>,key是target-nums[i],value是i,也就是元素在数组中的位置,这样遍历时在map中寻找key值与当前元素相等的,也就是当前位置元素等于target-nums[i],所以就找到了和为target的两个元素。class Solution {publ原创 2021-05-24 18:30:48 · 42 阅读 · 0 评论 -
66.加一easy
很简单,只需要注意到进位情况即可class Solution {public: vector<int> plusOne(vector<int>& digits) { vector<int>::size_type sz=digits.size(); bool ifadd=0; ++digits[sz-1]; if(digits[sz-1]==10){//最后一位加一后需要进位原创 2021-05-23 22:41:27 · 49 阅读 · 0 评论 -
350,两个数组的交集 easy
都是easy,没一个会做的。。。。方法一,所谓的双指针先对两个数组排序,然后两个指针分别从两个数组首元素开始遍历,若相同则加入要返回的数组,若不同,较的加一,直至其中至少一个数组到末尾class Solution {public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(),nums1.end());原创 2021-05-22 20:35:32 · 33 阅读 · 0 评论 -
136.只出现一次的数组 easy
神仙异或运算class Solution {public: int singleNumber(vector<int>& nums) { int n=0; for(int i:nums) n^=i; return n; }};0与任何数做异或运算都等于那个数自身与自身异或为零“开心消消乐”...原创 2021-05-22 19:56:37 · 39 阅读 · 0 评论 -
217.存在重复元素 easy
方法一:sort排序,再遍历class Solution {public: bool containsDuplicate(vector<int>& nums) { sort(nums.begin(),nums.end()); if(nums.size()<2) return false; for(int i=1;i<nums.size();++i){ if(nums[i-1]原创 2021-05-22 19:44:57 · 38 阅读 · 0 评论 -
189.旋转数组,medium
第一次:每次都向右平移一个,重复k次,结果超出时间限制第二次:想到了将k模sz(sz是数组长度)处理,然后循环替代前一个对应位置的元素,但是没有考虑到sz是k的倍数而导致一次循环并不能遍历所有元素这件事,提交运行错误查看题解法一是在另一新的数组中对应位置放置元素,虽然简单,确实我自己没有想到的。法二,在原数组循环更新元素。也就是我的大体思路,官方解释数学推导挺复杂,但是在我自己的运行出错的基础上搞懂了大体含义若从位置零开始,依次循环中2,4,6元素总是不会被访问到这种情况总是sz是k的倍数原创 2021-05-20 14:55:11 · 76 阅读 · 1 评论 -
买卖股票的最佳时机
思路:贪心算法,遍历,只要下一个元素比当前元素大且未买入时,可买入,当下一个元素比当前元素小且手里已经买入时,可以卖出以获利第一遍提交出现数组访问越界,未考虑到边界情况,下面是第一次提交的代码(此代码有误)class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size()<=1) return 0; int buy=-1,moneys原创 2021-05-20 13:22:05 · 79 阅读 · 0 评论 -
26.删除有序数组中的重复项
瞥到了双指针,遂有了想法class Solution {public: int removeDuplicates(vector<int>& nums) { int sz=nums.size(); if(sz<=1) return sz; int l=0,r=1; while(nums[l]!=nums[r]){ if(r==sz-1)原创 2021-05-20 12:48:24 · 68 阅读 · 0 评论 -
4.寻找两个正序数组的中位数
好~,自不量力的看了个困难题,第一眼,就这?暴力通通解决第二眼,还要求时间复杂度O(log (m+n))?想了想,有了点二分查找的意思,但是,奇数偶数感觉脑子有点不够用,看看题解,好家伙,看也看不懂本来写着上面的都想放弃了,以后再看,但是,第一个hard就放弃不太好吧,虽然这次以后大概率很长时间不会碰hard了虽然照着瞧出来了,但总感觉还差点意思class Solution {public: double get(vector<int>& nums1, vect原创 2021-05-19 22:15:31 · 58 阅读 · 0 评论