leetcode
文章平均质量分 50
leetcode刷题
优雅的疯
这个作者很懒,什么都没留下…
展开
-
力扣刷题:28. 实现 strStr()
题目要求版本一:泛型算法search整体思路直接使用search函数,将haystack字符串和needl字符串传入,得到返回值根据返回值判断最终的结果代码class Solution {public: int strStr(string haystack, string needle) { if (needle.empty()) { return 0; } auto i = std::search(haystack.begin(),原创 2021-07-11 22:33:21 · 151 阅读 · 1 评论 -
力扣刷题:27. 移除元素
题目要求版本一:泛型算法find整体思路使用sort对序列进行排序使用find得到指定值的迭代器将迭代器转换为unsigned型index(删除容器元素会导致原有迭代器失效)根据index进行相应的删除操作返回删除后的序列长度代码class Solution {public:int removeElement(vector<int>& nums, int val) { std::sort(nums.begin(), nums.end()); auto i原创 2021-07-11 22:29:12 · 127 阅读 · 0 评论 -
力扣刷题:26. 删除排序数组中的重复项
题目要求版本一:使用库函数理解unique:重排元素,将重复值排在后面。返回第一个重复值的迭代器该函数重排输入序列,将不重复的值放在前面,重复的值放在后面。返回尾端第一个出现重复值的位置利用unique元素重排序列根据返回的迭代器删除重复值版本二:遍历删除整体思路遍历数组,比较当前值与前一个值是否相等,如果相等则删除代码class Solution {public:int removeDuplicates(vector<int>& nums) {if (原创 2021-07-11 22:23:55 · 146 阅读 · 0 评论 -
力扣刷题:24. 两两交换链表中的节点
题目要求整体思路以两个结点为一组,一组一组的处理。处理的方法是改变结点中next指针的指向。在改变指针的指向时,涉及到该组的前一个结点。所以每一组需要处理3个结点代码class Solution {public:ListNode* swapPairs(ListNode* head) { if (head == nullptr) return head; ListNode *p1 = head, *p2 = head->next, *p0 = nullptr;原创 2021-07-11 22:18:47 · 109 阅读 · 0 评论 -
力扣刷题:23. 合并K个升序链表
版本一:递归整体思路每次从链表数组中选取值最小的一个结点,进行递归。为21. 合并两个有序链表思路的延续。代码class Solution {public:ListNode* mergeKLists(vector<ListNode*>& lists) { //最大值为10的4次方 int minValue = std::pow(10, 4) + 1, minIndex = -1; for (int i = 0; i < lists.size(); +.原创 2021-07-09 22:34:34 · 83 阅读 · 0 评论 -
力扣刷题:22. 括号生成
题目要求整体思路根据传入的参数确定字符串的长度:传入n,说明有n对括号,则字符串长度应该是2n。接下来递归的构造字符串:当当前index超过字符串最大index(字符串长度-1)时,将当前字符串放入字符串数组中当当前index没有超过最大index时:如果当前字符串中存在没有匹配过的左括号,则在当前位添加右括号,继续递归如果当前字符串已经存在的左括号小于n,则在当前位添加左括号,继续递归代码class Solution {public:vector<string> gen原创 2021-07-09 22:30:06 · 92 阅读 · 0 评论 -
力扣刷题:21.合并两个有序数组
题目要求版本一:将链表放进数组里整体思路创建一个存储结点指针的vector,遍历两个链表的同时将对应结点的地址存入vector中存储完毕后进行特殊值判断:如果vector为空,则返回nullptr利用谓词和泛型算法sort按照val值<制作自定义sort使用自定义sort对vector进行排序。重组链表,将数组中相邻结点的next指针连接起来返回数组头元素(一般不推荐这么做,因为这样破坏了链表的结构,达不到训练的效果…)代码class Solution {public:Li原创 2021-07-09 22:22:35 · 150 阅读 · 2 评论 -
力扣刷题:20. 有效的括号
题目要求整体思路创建一个存放字符的栈接着遍历字符串:当遇到左括号时就将其push进栈中当遇到右括号时,首先检查栈是否为空。如果不为空则再检查栈的顶部元素是否为与该右括号匹配的左括号。如果匹配,将栈顶元素弹出。最后检查栈是否为空:为空返回true不为空返回false代码class Solution {public:bool isValid(string s) { std::stack<char> stackChar; for (auto i : s) {原创 2021-03-31 12:23:35 · 104 阅读 · 0 评论 -
力扣刷题:18. 四数之和
题目要求很喜欢评论区里面的一个评论:高端的coder往往用最朴素的解法。这题和15题“三数之和”类似,只是三个数变成了四个数,还是双指针。整体思路用两重for循环选取first和second。在第二重循环中初始化forth为数组的最后一个元素利用双指针在第三重for循环中寻找third和forth:如果 sum(四数之和) > target, 说明当前的数太大了,需要向前移动forth来减小数值如果 sum < target, 说明当前数太小了,需要向后移动third来增加数值原创 2021-03-31 12:13:28 · 116 阅读 · 0 评论 -
力扣刷题:17. 电话号码的字母组合
题目要求整体思路首先建一个长度为10的vecotor,存放与数字相对应的字母接着根据digits的长度,利用深度优先递归的组成字符串:当nowIndex小于maxIndex(字符串长度)时,将digits[index]数字对应的所有字母分别加入字符串尾部。当nowIndex大于maxIndex(字符串长度)时,将组成的字符串放进字符串数组中。最后返回字符数组代码class Solution {public:vector<vector<char>> vChar;原创 2021-03-31 12:11:16 · 234 阅读 · 0 评论 -
力扣刷题:16. 最接近的三数之和
题目要求和15题“三数之和”很类似,都用到了双指针。这题我套15题的思路和模板一遍就过了整体思路首先使用泛型算法sort对数组进行排序接着使用第一个for循环选取first然后利用双指针在第二个for循环中选取second和third。还是一如既往,second从小到大,而third从大到小,第二层for循环的逻辑如下:• 当sum-target<0时,说明选的数太小了,要选大一点的数,所以往右移动second指针。• 当sum-target>0时,说明选的数太大了,要选小一点的原创 2021-03-31 12:08:03 · 104 阅读 · 0 评论 -
力扣刷题:15. 三数之和
题目要求做完的感受:这道题的官方解法巧就巧在利用双指针将三重for循环降为了两重for循环,将第三个变量的寻找和第二个变量融合在一起,在一个for循环里面利用两个指针将两个存在一定关联的变量找出来,十分巧妙。代码:双指针(三重for循环改进为二重for循环)class Solution {public:vector<vector<int>> threeSum(vector<int>& nums){ vector<vector<int原创 2021-03-31 12:04:54 · 106 阅读 · 0 评论 -
力扣刷题:14. 最长公共前缀
题目要求整体思路选取字符串数组中第一个字符串作为基准,将其与后面的字符串按照字符依次比对。当出现字符不相同时,记录不相同字符的index,将其更新为字符比较的上限。跳过当前字符串并继续比较下一个字符串,直至比较完所有的字符串。最终得到一个最短上限,该最短上限就是公共子串的长度。代码class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.e原创 2021-01-30 09:52:44 · 71 阅读 · 0 评论 -
力扣刷题:13. 罗马数字转整数
题目要求原题链接(一题两出,我直呼内行)代码:遇到特殊字符向前多看一位class Solution {public: map<string, int> m; int romanToInt(string s) { int index = 0, num = 0; string temp; mapInit(); while (index < s.size()) {原创 2021-01-30 09:52:24 · 85 阅读 · 0 评论 -
力扣刷题:12. 整数转罗马数字
题目要求代码:千位、百位、十位、个位依次处理class Solution {public: map<int,string> m; string intToRoman(int num) { string roman; //存储数字各个位(个位、十位、百位)上的数 int bitNumber; mapInit(); bitNumber = num / 1000; strRoma原创 2021-01-30 09:53:08 · 81 阅读 · 0 评论 -
力扣刷题:11. 盛最多水的容器
题目要求版本一:凭借我的直觉但是超时的做法class Solution {public: int maxArea(vector<int>& height) { unsigned MaxArea = 0, beforeHeight = 0, lowerHeight; for (unsigned i = 0; i < height.size(); i++) { if (height.at(i) &原创 2021-01-29 20:57:02 · 105 阅读 · 0 评论 -
力扣刷题:10. 正则表达式匹配
题目要求整体思路我主要分了四种情况来做:..*xx*其中前两种以’.'开头,后两种以x开头。分别判断每种情况。对于’.'和’x’这两种情况很容易,直接判断s和p是否相等即可。对于带有’*'的两种情况,我采用了递归的方法。因为不知道p中的闭包表达式需要“吞掉”多少个s中的相同字符。所以我每次移动s的指针时都进行一次自我递归。将s的子串和p的子串再次传入函数进行递归判断,如果可行就返回true,如果不可行就向前移动s的指针继续判断。有点类似于编译原理语法分析中的递归下降的分析方法:原创 2021-01-29 20:45:41 · 113 阅读 · 0 评论 -
力扣刷题:9. 回文数
题目要求给你一个整数 x ,如果 x 是一个回文整数,返回 ture ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。原题链接版本一:转换成字符串处理class Solution {public: bool isPalindrome(int x) { string s = std::to_string(x); if (s == string(s.crbegin(),原创 2021-01-29 20:34:30 · 339 阅读 · 0 评论 -
力扣刷题:8. 字符串转换整数 (atoi)
题目要求原题链接代码#define MaxValue pow(2,31)class Solution {public: int myAtoi(string s) { bool hasNumber = false; char sigh = '+'; int number; for (unsigned i = 0; i < s.size(); i++) { //跳过开头空格原创 2021-01-29 20:26:50 · 156 阅读 · 0 评论 -
力扣刷题:7. 整数反转
题目要求给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。原题链接代码class Solution {public: int reverse(int x) { int reverseX; string strX = std::to_string(x); string rStrX(strX.crbegin(), strX.crend()); try { revers原创 2021-01-29 20:03:57 · 75 阅读 · 0 评论 -
力扣刷题:6、Z字形变换
题目要求1 <= s.length <= 1000s 由英文字母(小写和大写)、’,’ 和 ‘.’ 组成1 <= numRows <= 1000原题链接代码class Solution {public: string convert(string s, int numRows) { if (numRows == 1) { return s; } int interval原创 2021-01-29 18:49:01 · 86 阅读 · 0 评论 -
力扣刷题:5、最长回文子串
题目要求给你一个字符串 s,找到 s 中最长的回文子串。(回文串就是正着读和反着读都一样的字符串)1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成版本一:一种凭借直觉但是超时的算法class Solution {public: string longestPalindrome(string s) { unsigned maxSize = 0; string maxHuiWen; for原创 2021-01-29 18:41:39 · 135 阅读 · 0 评论 -
力扣刷题:4. 寻找两个正序数组的中位数
题目要求给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?题目链接版本一:直接调用库函数class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { auto原创 2021-01-29 18:33:08 · 90 阅读 · 0 评论 -
力扣刷题:3. 无重复字符的最长子串
题目要求给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。题目链接提示我的代码class Solution {public: int lengthOfLongestSubstring(string s) { unordered_set<char> set; unsigned lenth = s.size(); int left = 0, right = 0, maxLenth = 0; while (原创 2021-01-29 18:19:04 · 54 阅读 · 0 评论