![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
山地环境
这个作者很懒,什么都没留下…
展开
-
LeetCode(9)-- Palindrome Number
题目解析: 输入一个整型数据,判断其是否是回文的。 大概思路是将每一位都保存到一个string中,遍历string,取前后两头的字符进行对比,直到最中间。 不论数据是奇数还是偶数,都可以用str[m] != str[len - m - 1]来判断。C++实现如下:class Solution {public: bool isPalindrome(int x) { str原创 2017-07-11 18:34:41 · 169 阅读 · 0 评论 -
LeetCode(33)--Search in Rotated Sorted Array
一般的查找都是在一个顺序容器中进行寻找,该题做了一些小变化,在顺序容器中有一个转折点。 假定一个数组在一个我们预先不知道的轴点旋转。例如,0 1 2 4 5 6 7可能会变为4 5 6 7 0 1 2。给你一个目标值去搜索,如果找到了则返回它的索引,否则返回-1。你可以假定没有重复的元素存在于数组中。可以利用一般的查找思路,二分法进行查找,对边界条件稍作修改即可。实现代码如下:class Solu原创 2017-08-04 11:41:44 · 165 阅读 · 0 评论 -
LeetCode(23)--Merge k Sorted Lists
转自博客 考虑分治的思想来解这个题(类似归并排序的思路)。把这些链表分成两半,如果每一半都合并好了,那么我就最后把这两个合并了就行了。这就是分治法的核心思想。但是这道题由于存的都是指针,就具有了更大的操作灵活性,可以不用递归来实现分治。就是先两两合并后在两两合并。。。一直下去直到最后成了一个。(相当于分治算法的那棵二叉树从底向上走了)。第一次两两合并是进行了k/2次,每次处理2n个值。第二次两两合转载 2017-07-27 11:09:35 · 163 阅读 · 0 评论 -
LeetCode(24)--Swap Nodes in Pairs
这道题是实现链表中两个两个数字的交换。一开始的思路是改变每一个数字next的指向,但是发现略为复杂,因此直接交换两个的val值。定义了两个指针,依次两个两个向后遍历,若链表为奇数个,则前面偶数对进行交换,最后一个数字不变。 实现代码如下:class Solution {public: ListNode* swapPairs(ListNode* head) { if (hea原创 2017-07-27 15:15:06 · 249 阅读 · 0 评论 -
LeetCode(25)--Reverse Nodes in k-Group
转载自博客 题目要求对链表中的元素按K个一组,反序后,形成新的链表。对于最后不满K个元素,保持原来的顺序输出。所以本题可以按如下方法解: 1、建立空的新链表list1. 2、如果原链表剩余元素个数不小于K个,则取K个元素,采用头插法构建反序的临时链表,插入list1的尾部。 3、如果链表剩余元素个数小于K个,则将剩余的链表插入到list1的尾部。 实现代码如下:class Solution转载 2017-07-27 22:16:53 · 236 阅读 · 0 评论 -
LeetCode(26)-- Remove Duplicates from Sorted Array
这道题比较简单,就是将输入数组的重复的数字删除,并返回新数组的长度。一开始理解错,以为只需要返回不重复数字的长度,实际还要对输入的数组nums删除重复数据。 实现代码如下:class Solution {public: int removeDuplicates(vector<int>& nums) { int len = 0; if (nums.size(原创 2017-07-27 22:42:10 · 157 阅读 · 0 评论 -
LeetCode(27)--Remove Element
这道题的题意是删除nums中和val值相等的元素,并返回新数组的元素个数。思路是首先对数组进行排序,这样和val值相同的数字会连续出现在一个区域,容易删除。定义两个迭代器,分别指向排序后新数组的val值区域的起始和终止位置,然后调用erase()函数。 实现代码如下:class Solution {public: int removeElement(vector<int>& nums,原创 2017-07-28 11:02:06 · 205 阅读 · 0 评论 -
LeetCode(28)--Implement strStr()
这道题题意是找到字符串中,子字符串出现的位置,若没有包含子字符串则返回1。可以直接调用string的函数find(a,b),其中a为子字符串,b为起始位置,若为查找到则返回无穷大。 代码实现如下:class Solution {public: int strStr(string haystack, string needle) { int res= haystack.fi原创 2017-07-28 14:11:32 · 162 阅读 · 0 评论 -
LeetCode(34)--Search for a Range
题目要求是:给定一个整型已排序数组,找到一个给定值在其中的起点与终点。 你的算法复杂度必须低于O(logn)。如果目标在数组中不会被发现,返回[-1, -1]。 例如,给定[5, 7, 7, 8, 8, 10],目标值为8,返回[3, 4]。 这道题思路也比较简单,大致思路如下:首先利用二分法找到等于target值的数,然后访问这个数的前面和后面,找到所有与target值相等的数,并记录下区间原创 2017-08-28 19:28:12 · 254 阅读 · 0 评论 -
LeetCode(35)--Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicates in the array.Here原创 2017-08-28 20:17:03 · 230 阅读 · 0 评论 -
LeetCode(36)--Valid Sudoku
这道题一看就是用空间来换取时间,正常情况下应该每行进行比较,每列进行比较,然后每一个网格进行比较,但是每个比较都有一个双层循环。可以借助STL中的set来进行判断是否已经存在该元素,典型的空间换取时间的方法。 C++ 11中对unordered_set描述大体如下:无序集合容器(unordered_set)是一个存储唯一(unique,即无重复)的关联容器(Associative containe原创 2017-08-29 10:15:27 · 247 阅读 · 0 评论 -
LeetCode(37)--Sudoku Solver
题意:解9*9数独做法:回溯 对每一个还没填充的格子,尝试1~9这9个数字,如果是合法的,则继续填充下一个格子,否则回溯。 判断合法:只需要判断对应行、对应列、对应3*3,有没有矛盾。实现代码如下:class Solution {public: void solveSudoku(vector<vector<char>>& board) { solve(board);转载 2017-08-29 10:55:19 · 233 阅读 · 0 评论 -
LeetCode(38)--Count and Say
第n个字符串依赖于第n-1个字符串,从左往右依次数出有连续几个数字。举例如下: 1 11 上个字符串中有1个1 21 上个字符串中有2个1 1211上个字符串中有1个2、1个1 111221 312211上个字符串中有3个1、2个2、1个1 13112221 1113213211实现代码如下:class Solution {public: string co原创 2017-08-29 16:50:47 · 209 阅读 · 0 评论 -
LeetCode(39)--Combination Sum
转载自:博客 这道题看过好几次最开始都没看出怎么做就一直留着,结果今天在做Subsets 这道题时找到了灵感,使用深度优先的方法搜索,并且用一个vector记录向量,找到合适的向量时即将它保存在结果中,并进行回溯操作。这道题相比于Subsets中使用回溯法而言更麻烦一些。以后需要注意这种解题方法,当要求解的结果是一系列向量的集合时使用dfs搜索记录路径这种方法。对于输入candidates=[1,转载 2017-09-01 10:00:04 · 177 阅读 · 0 评论 -
LeetCode(40)--Combination Sum II
与上一道题相比需要注意的是: 1、在同一层递归树中,如果某元素已经处理并进入下一层递归,那么与该元素相同的值就应该跳过。否则将出现重复。 例如:1,1,2,3 如果第一个1已经处理并进入下一层递归1,2,3 那么第二个1就应该跳过,因为后续所有情况都已经被覆盖掉。 2、相同元素第一个进入下一层递归,而不是任意一个 例如:1,1,2,3 如果第一个1已经处理并进入下一层递归1,2,3,那原创 2017-09-01 10:42:57 · 190 阅读 · 0 评论 -
leetCode (41)--First Missing Positive
这道题,我的思路大致如下: 首先对数组进行排序,设置一个计数为i,记录已经出现的正整数数目,依次遍历排序后的数组,判断大于0的元素是否等于i,若不等于可以判断为缺少的最小正整数就是i;要考虑的特殊情况是有重复数字出现和最后一位元素的判断。若与前一位数字相同,则继续下一次遍历,i不递增,特殊的如果最后一位是重复的,直接返回i;若判断到最后一位,返回i+1。如果不是特殊情况,i递增,继续遍历。clas原创 2017-09-01 15:08:19 · 205 阅读 · 0 评论 -
LeetCode(42)--Trapping Rain Water
这道题的要求是计算最多能装多少水。其中,数组中的数字表示高度。这道题的思路是采用l和r两个指针,维护装水两边的位置。当l处高度低时,说明l右侧装的水肯定和l处一样高,此时逐步右移l,同是加上l处与右移后位置高度差(因为这里都能装水啊),直到再遇到同样高或者更高的位置。然后进行下一轮判断。同样,当r处高度低时,说明r左侧的水肯定和r处一样高,此时逐步左移r,同是加上r处与左移后位置高度差,直到再遇到同转载 2017-09-01 16:37:10 · 199 阅读 · 0 评论 -
LeetCode(22)--Generate Parentheses
这道题考虑用递归算法。截至条件是剩余的左括号和右括号数都为0,在递归时注意剩余的左括号数要小于右括号数。实现代码如下:class Solution {public: vector<string> generateParenthesis(int n) { vector<string> res; if (n < 1)return res; help原创 2017-07-26 16:57:23 · 132 阅读 · 0 评论 -
LeetCode(21)--Merge Two Sorted Lists
这道题目是要求合并两个有序链表,思路是一次比较两个链表的元素,插入到新的链表中,需要注意的是三个指针的一些细节问题,截至条件是一个链表访问完毕,直接将另一个链表附在新链表后面即可。 实现代码如下:class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == N原创 2017-07-26 11:32:56 · 136 阅读 · 0 评论 -
LeetCode(10)--RegularExpresssionMatching
方法转载自原博客 题目Implement regular expression matching with support for ‘.’ and ‘*’.样例‘.’ Matches any single character. ‘*’ Matches zero or more of the preceding element.The matching should cover the entir转载 2017-07-12 21:28:55 · 225 阅读 · 0 评论 -
LeetCode(8)-- String to Integer(atoi)
首先想到C++中的atoi函数,函数为int atoi(const char* a),此处函数输入要求是const char*类型。string转换为const char*可以使用str.c_str()得到一个int类型。 需要注意的特殊情况有:整数的范围,如果超过这个范围则输出上下界即可。字符串前面有空格,并不是一开始就是数字常见的数据类型的范围。其中编程的时候忘记了可以写成INT_MAX原创 2017-07-07 16:41:37 · 171 阅读 · 0 评论 -
LeetCode (11)-- Container With Most Water
Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lin原创 2017-07-17 11:00:40 · 165 阅读 · 0 评论 -
LeetCode(29)--Divide Two Integers
这道题要求不使用*,/,%的符号来实现除法。一开始考虑不断用被除数减去除数,计算轮数来得到结果,但是在极端情况下,比如被除数是INT_MAX,除数是1时,会超时。因此,在网上看到大家使用‘<<’’>>’左移右移的符号,实现乘以2的次方,大大减少了耗时。 思路如下: 举个例子: 实现的代码如下:class Solution {public: int divide(int div原创 2017-07-29 17:45:32 · 197 阅读 · 0 评论 -
LeetCode(13)-- RomanToInteger
这道题和上一道题刚好相反,是将罗马数字转变为整数型数字。可以发现一个规则就是当前一个字母小于下一位时则代表减去该数,如“IV”,此处的‘I’表示-1,而“VII”此处的‘I’表示+1,且因为一个字母最多重复三次,所以尽可能出现一次小数在大数前面,即不会出现“IIV”。因此利用该规律编写代码如下:class Solution {public: int romanToInt(string s)原创 2017-07-18 10:17:49 · 314 阅读 · 0 评论 -
LeetCode(12)--Integer to Roman
罗马数字的规则如下: ·个位数举例 I, 1 II, 2 III, 3 IV, 4 V, 5 VI, 6 VII, 7 VIII, 8 IX, 9 ·十位数举例 X, 10 XI, 11 XII, 12 XIII, 13 XIV, 14 XV, 15 XVI, 16 XVII, 17 XVIII, 18 XIX, 19 XX, 20 XXI, 21 XXII, 22 XXIX, 29 XXX原创 2017-07-17 20:02:19 · 205 阅读 · 0 评论 -
LeetCode(14)--Longest Common Prefix
这道题,我用的就是一开始想到的笨办法,一开始提取前两个的公共字符串再接着与第三个相比,直到比完整个字符串vector。实现代码如下:class Solution {public: string longestCommonPrefix(vector<string>& strs) { string str; if (strs.size() == 0){/原创 2017-07-18 16:51:35 · 194 阅读 · 0 评论 -
LeetCode(30)--Substring with Concatenation of All Words
转载自博客 LeetCode30———–Substring with Concatenation of All Words 看题目都有些费劲,要不是看了几组Custom Testcase才知道题意,顺便说一句Custom Testcase这个功能在调试的时候真的非常实用。 题目意思: 给定一个字串不妨称为母串S,和一组单词,他们保存在一个string的顺序容器Words中,并且满足一个条件,转载 2017-07-31 11:22:05 · 205 阅读 · 0 评论 -
LeetCode(31)--Next Permutation
就是将这个数组排列成下一个较大的数,如果已经是最大的了,就排列成最小的数。 我是这么想的,从后往前遍历数组,如果一直是逐渐增大的,则已经是最大的了,如果出现了一个下降的数,那么遍历就到此为止,因为这已遍历的部分就可以排列成下一个较大的数了 当找到这个突然下降的点A后,由于它后面已经排列为“最大”,即从前往后一直变小,所以应该从后面比A大的数中找最小的点B,然后A和B交换位置。这个时候以B开头,后原创 2017-07-31 17:35:26 · 228 阅读 · 0 评论 -
LeetCode(15)--3Sum
题目:找到一组数字中,三个数之和为0的所有数。值得注意的就是不能有重复的组合。 思路: 如果是暴利搜索肯定会超时,所以首先对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了,中间如果遇到跟前一个数相同的数字就直接跳过。对于遍历到的数,如果大于0则跳到下一个数,因为三个大于0的数相加不可能等于0;否则用0减去这个数得到一个sum,我们只需要在这个数原创 2017-07-19 15:49:01 · 217 阅读 · 0 评论 -
LeetCode(16)--3Sum Closest
该题与上一题有些类似,但是比上一道题简单很多,不需要考虑有没有重复的情况。因此大致思路如下: 先对数组进行排序,然后从头开始遍历直到nums.size()-2的每一个元素,对于每一个元素在此元素之后寻找两个元素使得三个数的和离target最近。实现代码如下:class Solution {public: int threeSumClosest(vector<int>& nums, int原创 2017-07-19 17:21:19 · 195 阅读 · 0 评论 -
LeetCode(17)--Letter Combinations of a Phone Number
转载自博客Letter Combinations of a Phone NumberGiven a digit string, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons转载 2017-07-24 15:53:12 · 266 阅读 · 0 评论 -
LeetCode(32)--Longest Valid Parentheses
这道题可以借用前面的括号匹配的思路,使用栈来解决。这次,我们压入栈的不再是‘(’或者‘)’,而是它的索引值。 大致思路如下: 遍历字符串s,当当前字符是‘(’,则压入栈中;若是‘)’,则判断栈顶是否为‘(’,若是则将栈顶的‘(’弹出,若不是则压入栈中。最后栈中剩下的数字就是不能匹配的‘(’和‘)’的索引值。 例如:”)()())()()(” 最后栈中剩余值为“0 5 10” 说明0~5之间原创 2017-08-01 22:34:36 · 159 阅读 · 0 评论 -
LeetCode(15)--4Sum
题目分析: 这道题和2Sum类似,先固定两个数,再去从第二个数后开始从两头滑动,寻找到四个数和为target。但依然要注意的是重复的问题。实现代码如下:class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target){ vector<vector<int>> res = {}; i原创 2017-07-24 18:21:11 · 142 阅读 · 0 评论 -
LeetCode(19)--Remove Nth Node From End of List
采用两个指针,一个快指针一个慢指针。快指针先走,直到指向第n+1位置,然后快慢指针一起走,直到快指针走到链表尾部,这时候慢指针指向的就是倒数第n+1位置,这样访问其next即可删除该节点。 实现代码如下: 需要注意的特殊情况是要删除的结点是头结点时,此时访问不了前一位,需要特别考虑。class Solution{public: ListNode* removeNthFromEnd(Li原创 2017-07-25 10:14:15 · 155 阅读 · 0 评论 -
LeetCode(20)-- Valid Parentheses
这道题是一道简单的符号匹配问题。可以用栈来解决。‘(’和‘)’匹配,‘[’和’]’匹配,‘{’和‘}’匹配,遍历输入的字符串,依次压入栈中,若待压入的字符和栈顶字符相匹配,则说明这是一对匹配的字符,则弹出栈顶字符,继续遍历。截至条件就是遍历结束后,若栈中没有字符则说明全部匹配正确,否则说明字符串匹配错误返回false。 实现代码如下:class Solution {public: boo原创 2017-07-25 20:06:58 · 142 阅读 · 0 评论 -
LeetCode (43) Multiply Strings
按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。观看下图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下转载 2017-09-02 11:23:14 · 230 阅读 · 0 评论