随笔分类 - LeetCode
摘要:题目:给定一个数组,找出其中和为0的所有4个数组合,每个组合内的4个数非递降。解法:①先排序,然后利用4个指针,前两个遍历,后两个在第二个指针之后的部分里夹逼,时间O(N3)。②或者利用一个哈希表先保存每两个数的和,然后类似于查找两个数的和等于给定值的过程。代码:① 1 class Solution...
阅读全文
摘要:题目:给定一个数组,和一个指定的值,找出数组中3个数,它的和最接近这个指定值,并返回这个和。解法:和上一题找3个数的和为0一样,先排序再遍历,这一次不需要记录路径。代码: 1 class Solution { 2 public: 3 int threeSumClosest(vector &n...
阅读全文
摘要:题目:给定一个数组,找出其中和为0的所有3个数的组合。每个组合的3个数都是非递降的。解法:先排序再遍历,设置3个指针,第一个依次遍历,第二三个在第一个指针后面的部分里,左右夹逼查找和为第一个数的相反数的组合。时间O(N2)。代码: 1 class Solution { 2 public: 3 ...
阅读全文
摘要:题目:给定一系列的字符串,找出这些字符串的最长公共前缀。解法:暴力法,依次比较每个字符串的每个字符,碰到第一个不同的就返回之前找到的前缀。代码: 1 class Solution { 2 public: 3 string longestCommonPrefix(vector &strs) {...
阅读全文
摘要:题目:将罗马数字转换为整数。解法:可以参考上一篇数字转换为罗马数字的规则。代码: 1 class Solution { 2 public: 3 int sym2int(char sym) //罗马数字字符与数字的对应关系 4 { 5 switch(sym) 6...
阅读全文
摘要:题目:将整数转换为罗马数字。罗马数字规则可以参考: 维基百科-罗马数字解法:类似于进制转换,从大的基数开始,求整数对基数的商和余,来进行转换。代码: 1 class Solution { 2 public: 3 string intToRoman(int num) { 4 s...
阅读全文
摘要:题目:正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次。解法:一定要注意'*'必须结合前面的字符一起使用。代码: 1 class Solution { 2 public: 3 bool isMatch(const char *s...
阅读全文
摘要:题目:判断一个数字是不是回文数字,即最高位与最低位相同,次高位与次低位相同,...解法:求出数字的位数,然后依次求商和求余判断是否相等。代码: 1 class Solution { 2 public: 3 bool isPalindrome(int x) { 4 if(x =...
阅读全文
摘要:题目:字符串转换为数字。解法:这道题的意思是要考虑到,如果有前置的空字符,则跳过;如果超出数字范围,则返回最大/最小整数;如果碰到第一个不能转换的字符,则返回。代码: 1 class Solution { 2 public: 3 int atoi(const char *str) { 4 ...
阅读全文
摘要:题目:数字翻转,即输入123,返回321;输入-123,返回-321。代码: 1 class Solution { 2 public: 3 int reverse(int x) { 4 int result = 0, sign = 1; 5 if(x < 0...
阅读全文
摘要:题目:把一个字符串按照Z型排列后打印出来,例如"PAYPALISHIRING" 重新排列后为3行,即P A H NA P L S I I GY I R那么输出为"PAHNAPLSIIGYIR"解法:细节实现题,假如重新排列为5行,那么排列后的下标分布应该为0 8 ...
阅读全文
摘要:题目:给定一个字符串S,返回S中最长的回文子串。S最长为1000,且最长回文子串是唯一。解法:①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的回文子串长度(长度为偶数)。时间为O(N2)。②另外,有一个很奇妙的算法,称为Manacher算法,参考h...
阅读全文
摘要:题目:两个数字求和,数字用链表表示,每一个结点代表一位。链表顺序与数字顺序相反,即表头存放数字的最低位。解法:分别遍历两个链表的每个结点,对两个结点求和即可。要维护一个变量保存每次相加之后的进位。更常见的,链表顺序与数字顺序相同,那么做一次链表逆序,求和之后再逆序回来即可。代码: 1 /** 2 ...
阅读全文
摘要:题目:给定一个字符串,返回其中不包含重复字符的最长子串长度。解法:维持两个指针,第一个指向子串开始,第二个负责遍历,当遍历到的字符出现在子串内时,应计算当前子串长度,并更新最长值;然后第一个指针更新为出现位置的下一个。代码: 1 class Solution { 2 public: 3 in...
阅读全文
摘要:题目:找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n))。解法:更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值。代码: 1 class Solution 2 { 3 public: 4 double findMedianSortedArrays(int ...
阅读全文
摘要:题目地址:https://oj.leetcode.com/problems/two-sum/Two SumGiven an array of integers, find two numbers such that they add up to a specific target number.Th...
阅读全文