
刷题
y_m_h
这个作者很懒,什么都没留下…
展开
-
leetcode912.排序数组的题解
思考:经典算法、前人经验当然是很好的,能够解决大部分问题,但是总有新的未知的情况出现,那么如何改进经典算法解决现有问题就是一个有趣的事情,把前人的算法理解透彻、算法的每一步的作用、新问题给现有算法带来了哪些挑战、如何改进原有算法既能不影响对于原有测试用例的处理效果又能改进对于新问题的处理效果,怎么办呢,勤学好问、多思考、多见识,把有趣的问题想清楚、弄明白,不贪多求全,找准方向、方法,刻意训练。笔者使用了快速排序,但是直接使用最原始的快速排序,有些特殊的测试用例会超时。原创 2024-11-06 20:26:58 · 402 阅读 · 0 评论 -
LeetCode457.环形数组是否存在循环
存在一个不含0的环形数组nums,每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数:1)如果 nums[i] 是正数,向前移动 nums[i] 步2)如果 nums[i] 是负数,向后移动 nums[i] 步因为数组是环形的,所以可以假设从最后一个元素向前移动一步会到达第一个元素,而第一个元素向后移动一步会到达最后一个元素。数组中的循环由长度为k的下标序列seq:1)遵循上述移动规则将导致重复下标序列 seq[0] ->seq[1] -> ....原创 2021-08-08 19:08:38 · 269 阅读 · 0 评论 -
Floyd判圈算法
Floyd判圈算法,又称快慢指针算法、龟兔赛跑算法,是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,求出该环的起点与长度的算法。如果有限状态机、迭代函数或者链表上存在环,那么从同一个起点(即使这个起点不在某个环上)同时开始以不同的速度前进,2个指针最终相遇,那么可以判定存在一个环,且可以求出2者相遇所在的环的起点、环的长度。算法描述:初始状态下,假设已知某个起点为结点S。现设两个指针slow、fast,将它们均指向S,接着,同时让slow指针、fast指针向前推进但是二者的速度不.原创 2021-08-08 16:32:53 · 219 阅读 · 0 评论 -
LeetCode141.环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不做为参数进行传递,仅仅是为了表示链表的实际情况,pos为-1或者链表中的一个有效索引如果链表中存在环,则返回true,并返回环入口在链表中的位置。否则,返回false。示例1:输入:head=[3,2,0,-4], pos=1输出:true,原创 2021-08-08 11:27:21 · 122 阅读 · 0 评论 -
螺旋矩阵问题
题目:给定一个正整数n,生成一个包含1到 n^2 的所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。例子:输入:3 输出:[[1, 2, 3], [ 8, 9, 4], [ 7, 6, 5]]解题思路:这里使用二维数组,按照螺旋排列顺序插入正整数,排列方向共有4个,分别是从左上到右上、从右上到右下、从右下到左下、从左下到左上,这里需要注意方向变化时,数组下标的处理方式代码如下所示:#include <iostream>#include <str...原创 2021-08-07 13:23:52 · 245 阅读 · 0 评论 -
获取长度最小的子数组
给定一个整数数组和一个整数key,如果子数组元素之和不小于key,返回该类子数组中长度最小子数组对应的此题有两类解法:1)暴力解法(使用两重for循环),代码如下所示#include <iostream>#include <string>#include <vector>using namespace std;int getMinLength(vector<int>& arr, int key) { int minLen原创 2021-08-04 23:29:25 · 189 阅读 · 0 评论 -
移除一个数组中所有值等于val的元素
题目:给定一个整数数组,从数组中移除所有值等于val的元素,返回移除元素后数组的长度第一种解法(暴力解法):思路:遍历数组中的每个位置的元素,检查是否等于val,1)若等于val,则将当前位置以后的元素均前移一个位置,并继续从当前位置遍历2)若不等于val,则遍历下一个位置#include <iostream>#include <string>#include <vector>using namespace std;int deleteNu原创 2021-08-01 17:19:28 · 349 阅读 · 0 评论 -
使用C++刷题时,对输入文本行的处理方式
笔者在使用C++刷题的初期,经常无法将用户输入存储到程序中的变量,根本原因是当时没有理解C++控制台输入的原理,为此特撰写本博客记录C++控制台输入的原理及经常用到的输入函数。在控制台中输入一行字符后,按下回车键,这行字符被送入缓冲区,回车键'\r'被替换为换行键'\n',cin>>temp :先声明一个具体类型的变量,然后从缓冲区中取出按'\0'、'\t'、'\n'分割的一个字符串,并将该字符串转换为对应的类型,如果该字符串对应的类型与实现声明的类型不匹配,则会导致未定义的行为(例如,原创 2021-08-01 13:30:28 · 234 阅读 · 0 评论 -
C++处理输入文本行(一行中包含多个字符串)
第一种方法:使用cin.get(ch),循环检查输入缓冲区中的每个字符是否为空格、换行符,并进行分支处理,代码如下所示:#include <iostream>#include <string>#include <vector>using namespace std;int main() { vector<string> arr; string temp; char ch; while(cin.get(c原创 2021-08-01 00:38:15 · 1950 阅读 · 0 评论 -
给定一个有序数组和插入值,使用二分法求出插入位置
当然对一个有序数组来说,插入一个数,求出插入位置可以使用暴力算法,将插入值与有序数组从头到尾进行比较。这里介绍一种更优的二分法解法,代码如下所示#include <iostream>#include <string>#include <vector>using namespace std;int binarySearch(vector<int>& arr, int num, int left, int right) { if(l原创 2021-07-29 23:30:18 · 881 阅读 · 0 评论