
高频题
文章平均质量分 54
高频算法题
vector<>
这个作者很懒,什么都没留下…
展开
-
【来不及刷题之】41、零钱兑换
时的最少硬币数(原问题),如果你知道凑出。的最少硬币数(子问题),原创 2021-01-15 21:11:08 · 294 阅读 · 0 评论 -
【来不及刷题之】39、x的平方根(二分法)
【二分法】 k*k<=X的平方,要求的是最接近的整数 mid*mid不断靠近x int mySqrt(int x) { int left=0,right=x,mid=0,res=0; while(left<=right){//注意是小于等于,不然x=0的时候进不来 mid=left+(right-left)/2; cout<<mid; if((long long)mi..原创 2021-02-06 19:13:20 · 167 阅读 · 0 评论 -
【来不及刷题之】36、删除排序链表中的重复元素 || (快慢指针)
思路:既然是递增有序,那么重复的元素第一是紧挨着一起的。 方法:遍历单链表,检查后继节点是否和自己相同,相同则删除后继节点,否则继续遍历 出口:没有节点或者只有一个节点的情况下直接return LinkList DeleteSame(LinkList L) { if (L == NULL||L->next==NULL)return L; LNode*p = L,*q=p; while (p) { q = p->next; if (q && (p-原创 2020-07-03 22:51:19 · 2344 阅读 · 0 评论 -
【来不及刷题之】35、二叉树的右视图(层次遍历)
本题只要记录层次遍历每一层的最右侧结点即可 vector<int> rightSideView(TreeNode* root) { vector<int> res; if(root==nullptr)return res; TreeNode *p=root; queue<TreeNode*> que; que.push(p); while(!que.emp..原创 2021-02-06 11:02:15 · 132 阅读 · 2 评论 -
【来不及刷题之】27、字符串相加(双指针)
【方法一:模拟竖式加法】定义两个指针 i 和 j 分别指向 num1 和 num2的末尾,即最低位,同时定义一个变量 add维护当前是否有进位,然后从末尾到开头逐位相加即可。数字位数不同时,我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。原创 2021-02-06 10:19:07 · 337 阅读 · 0 评论 -
【来不及刷题之】26、删除链表的倒数第N个结点(快慢指针)
思路:删除倒数第n个结点就需要找到倒数第n+1个结点。之前我们就写过找到单链表倒数第n个结点的题目,,防止要删除的是链表的第一个结点,它前面那个结点不存在就无法删除了。,使用的是快慢指针的方法。但是这个题目需要注意的是,原创 2022-12-01 21:21:26 · 174 阅读 · 0 评论 -
【来不及刷题之】25、合并K个升序链表(分治+小根堆)
思路:合并K个单链表,可以转成n个合并两个单链表的问题。但是这种方法的时间复杂度会比较高,更好的方法是使用优先队列,但这个方法还没有学到,暂时先缓一下。原创 2022-12-01 15:57:31 · 125 阅读 · 0 评论 -
【来不及刷题之】24、反转链表 ||(双指针)
虽然时间复杂度,空间复杂度都不怎么样,好歹是自己写出来的。原创 2021-03-03 10:40:56 · 113 阅读 · 0 评论 -
【来不及刷题之】18、环形链表||:求入环点(快慢指针)
【双指针】fast指针每次走两步,slow指针每次走一步,如果没有环slow和fast永远不会相遇。fast比slow先入环,如果两个指针要相遇,只可能是这样一种情况可以理解为,fast指针对slow指针的追赶是相对速度1,追赶过程中是一个节点一个节点走的,所以最终一定能相遇。然而我们并不关心转了几圈,只关心入环点是谁,所以可以只看o=1的情况,此时x=zps:实际上第一次相遇点肯定是在,但是这需要数学归纳法的推导,有点难以理解,所以就用了上述推导,设置了slow转的圈数n。原创 2021-02-05 10:22:14 · 194 阅读 · 0 评论 -
【来不及刷题之】16、买卖股票的最佳时期(动态规划)✅
【方法一】过去在最低点买入,就有可能获得最大利润【方法二】动态规划。原创 2021-02-04 21:41:39 · 169 阅读 · 0 评论 -
【来不及刷题之】15、有效的括号
王道原题 【思路】 遇到左括号 直接入栈 遇到右括号 如果栈空,返回false 如果与栈顶元素不匹配,返回false 如果与栈顶元素匹配,弹出栈顶元素 遍历结束栈不为空,返回false。 bool isValid(string s) { stack<char> kuohao; for(int i=0;i<s.length();i++){ if(s[i]=='('||s[i]=='['||s[i]==...原创 2021-02-06 12:05:17 · 92 阅读 · 0 评论 -
【来不及刷题之】14、搜索旋转排序数组
不过题目原意应该不是让人粗暴的解决,并且时间复杂度也很高。折腾了一下,换成在两个有序数组里面进行二分搜索。唯一的收获是重新复习了一下二分搜索,实际上空间复杂度比上面更差。有点怀疑自己是不是理解错了题意,毕竟这是一道中等题,结果震惊到我了。看到这个题目下意识写了下面的程序。原创 2021-03-04 21:13:29 · 198 阅读 · 4 评论 -
【来不及刷题之】13、合并两个有序链表
之前王道上有一个题目是按照逆序合并两个单链表,只需要在下面这个题目的基础上改成头插即可 https://blog.youkuaiyun.com/qq_39328436/article/details/107473409 【方法一:前后指针+头结点+尾插】 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1==nullptr) return l2; if(l2==nullptr) return l1; ..原创 2021-02-05 23:30:17 · 201 阅读 · 0 评论 -
【来不及刷题之】11、最大子数组和(动态规划)+ 最长递增子序列
【算法思路】 既然要求时间复杂度是n,空间复杂度是1,那么只能用一次遍历 当前累加值为负数时,将累加值规0,并从下一个位置开始重新遍历,因为只有正数才能带来更大的累加和 是一个简单题,但是我却没有想到!不应该不应该,继续努力! int maxsumofSubarray(vector<int>& arr) { int count = 0; int max = INT_MIN; for (int i = 0; i < arr.size(); i++) { cou..原创 2021-01-09 21:09:24 · 207 阅读 · 0 评论