Leetcode题解(二)
4、Median of Two Sorted Arrays(*)
题目
题目要求找到两个排序数组的中位数。
中位数的定义:当n为奇数时,median = array[n/2];当n为偶数时,median = (array[n/2]+array[n/2+1])/2.
暴力算法,两个数组归并排序,对合并的数组求中位数。代码如下:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> res; int i=,j=;
int length1 = nums1.size();
int length2 = nums2.size(); while (i<length1 && j<length2)
{
if (nums1[i] < nums2[j])
{
res.push_back(nums1[i]);
i++;
}
else
{ res.push_back(nums2[j]);
j++;
}
}
while (i<length1)
{
res.push_back(nums1[i]);
i++;
}
while (j<length2)
{
res.push_back(nums1[j]);
j++;
} if((length2 + length1) % == )
return res[(length2 + length1)/];
else
{
return (res[(length2 + length1)/] + res[(length2 + length1)/ + ])/;
} }
};
但是,题目要求时间复杂度为O(log(m+n)),因此上面的算法是不符合要求的,因为其时间复杂度为O(m+n)。
如果时间复杂度为O(log(m+n)),肯定会用到二分查找算法。问题是现在有两个数组,怎样灵活的使用二分查找呢?这就需要开动脑筋了
5、Longest Palindromic Substring(*)
题目要求寻找字符串中最长的回文子串。
国际惯例,第一想法:暴力求解,固定一个自创s[i,j]判断其是否为回文串,代码如下:
class Solution {
public:
string longestPalindrome(string s) {
if("" == s)
return s; int i,j;
int length = s.size();
string sub;
int max
string res = "";
for(i=;i<length;i++)
{
for (j=i;j<length;j++)
{
sub = s.substr(i,j-i+);
if(isPalindromic(sub))
{
if(sub.length() > max)
res = sub;
} }
}
return res;
}
bool isPalindromic(string sub)
{
int length = sub.size();
int i,j=length-;
while(i<j)
{
if(sub[i] != sub[j])
return false;
i++;
j--;
}
return true;
}
};
该算法时间复杂度是O(n*n),当n比较大的时候,算法的性能比较低,不能很快的解决问题。导致算法性能低下的原因是产生了回溯。如果能避免回溯,算法性能则能显著提高。
看到这道题目的时候,我们会联想到一道经典的算法题目“最长公共子串”,即求两个字符串最长公共子串(LCS),解决LCS的算法是利用动态规划,重点是求出一个二维数组,其实现代码参考如下:
string LCS(string s1,string s2)
{ int len1 = s1.length();
int len2 = s2.length(); char*c=malloc(len2),*p; int start,end,len,i,j;
end=len=; for(i=; i<len1; i++) //串1从前向后比较
{
//串2从后向前比较,为什么要从后向前呢?是把一维数组c[ ]当二维数组来用, // for(j=0;j<lenRight;j++)//当c申明为一个二维数组时
for(j=len2-; j>=; j--)
{
if(s1[i] == s2[j])//元素相等时
{
if(i==||j==)
c[j]=;//c[i][j]=1;
else
{
c[j]=c[j-]+;//c[i][j]=c[i-1][j-1]+1;
}
}
else
c[j] = ; //c[i][j]=0;
if(c[j] > len) //if (c[i][j]>len)
{
len=c[j]; //len=c[i][j];
end=j;
}
}
}
start=end-len+; //数组p纪录最长公共子串
p =(char*)malloc(len+);
for(i=start; i<=end; i++)
{
p[i-start] = right[i];
}
p[len]='\0';
string res(p);
return res;
}
LCS算法中,是利用空间来换取时间。时间复杂度为O(len1+len2);
现在回到最长回文子串中,通过观察可以得知,最长回文子串其实就是将原始的字符串与其逆序之后的字符串的最长公共子串,因此,解决这个问题可以采用如下方法,先将原始字符串s逆序变为s‘,然后求其最长公共子串,代码如下:
class Solution {
public:
string longestPalindrome(string s)
{
if("" == s)
return s; string temp = s;
reverse(temp.begin(),temp.end()); return LCS(s,temp);
}
string LCS(string s1,string s2)
{ int len1 = s1.length();
int len2 = s2.length(); char *c=new char[len2],*p; int start,end,len,i,j;
end=len=; for(i=; i<len1; i++) //串1从前向后比较
{
//串2从后向前比较,为什么要从后向前呢?是把一维数组c[ ]当二维数组来用, // for(j=0;j<lenRight;j++)//当c申明为一个二维数组时
for(j=len2-; j>=; j--)
{
if(s1[i] == s2[j])//元素相等时
{
if(i==||j==)
c[j]=;//c[i][j]=1;
else
{
c[j]=c[j-]+;//c[i][j]=c[i-1][j-1]+1;
}
}
else
c[j] = ; //c[i][j]=0;
if(c[j] > len) //if (c[i][j]>len)
{
len=c[j]; //len=c[i][j];
end=j;
}
}
}
start=end-len+; //数组p纪录最长公共子串
p =(char*)malloc(len+);
for(i=start; i<=end; i++)
{
p[i-start] = s2[i];
}
p[len]='\0';
string res(p);
return res;
}
};
另外一种方法就是借鉴LCS的思想,直接构造解决该问题的实现算法。代码如下(网上摘抄):
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length(), max = , ss = , tt = ;
bool flag[len][len];
for (int i = ; i < len; i++)
for (int j = ; j < len; j++)
if (i >= j)
flag[i][j] = true;
else flag[i][j] = false;
for (int j = ; j < len; j++)
for (int i = ; i < j; i++)
{
if (s[i] == s[j])
{
flag[i][j] = flag[i+][j-];
if (flag[i][j] == true && j - i + > max)
{
max = j - i + ;
ss = i;
tt = j;
}
}
else flag[i][j] = false;
}
return s.substr(ss, max);
}
};
------------------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------
6、ZigZag Conversion
这道题目没有什么可说的,直接代码;
class Solution {
public:
string convert(string s, int nRows) {
if (nRows <= || s.length() == )
return s;
int index=,temp;
string res="";
int len = s.length();
const int val = *nRows-;
//注意第一行和最后一行的规律
for (index = ;index<nRows&&index<len;index++)//注意当nrows>len时
{
temp = index;
res+=s[temp];
while (temp<len)
{
temp = temp + val;
if(index== ||index == nRows-)
{
if (temp<len)
{
res+=s[temp];
continue;
}
break; }
else
{
temp = temp-*index;
if (temp<len)
{
res+=s[temp];
}
else
break;
temp = temp+*index;
if (temp<len)
{
res+=s[temp];
}
else
break; }
} }
return res; }
};
----------------------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------
7、Reverse Integer
题目
题目要求是反转一个整数,整数包括正数和负数,需要注意的地方是如果一个整数最后几个数字是0,反转后的整数将去掉前面的几个0,比如100--->1;代码如下:
class Solution {
public:
int reverse(int x) {
int res=,temp=x,i,j;
int flag=;
if (x<&&x!=-)
{
temp = -temp;
flag=-;
}
if (x==-)//特例
{
return ;
} while(temp)//
{
i=temp%;
if(res>)return ;
res = res * + i;
temp/=;
}
if (res>(int)pow(2.0,)-)
{
return ;
}
res = flag * res; return res; }
};
这道题目的难点是有几个比较特殊的整数需要单独处理。
Leetcode题解(二)的更多相关文章
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
- 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
- [LeetCode 题解] Search in Rotated Sorted Array
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...
- 【LeetCode题解】206_反转链表(Reverse-Linked-List)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 git ...
随机推荐
- FS BPM 业余研发(用户详细操作手册--单人串行/并行)之 深圳分公司技术部请假审批流程
1.FS BPM 简介 BPM软件中BPM是英文字母缩写,大致有二个意思.第一.Business Process Management,即业务流程管理,是一套达成企业各种业 务环节整合的全面管理模式. ...
- WPF控件自适应屏幕
如果说界面设计,那么自适应问题一定无法避免,今天就来分享一下,wpf如何实现自适应,先看一下效果:(文末添加源代码下载) 基本思路就是用 Grid 的网格,进行宽度的自动填充适应, 不过对于 ...
- oracle数据库知识点
1.oracle启动后的服务 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存 ...
- Linux学习——shell编程之环境变量配置文件
小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...
- MySQL优化原理
前言 说起MySQL的查询优化,相信大家收藏了一堆:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理 ...
- h5 meta学习
定义针对搜索引擎的关键词:<meta name="keywords" content="meta,red" /> 定义对页面的描述:<meta ...
- Ubuntu Docker 版本的更新与安装
突然发现自己的docker 版本特别的低,目前是1.9.1 属于古董级别的了,想更新一下最新版本,这样最新的一下命令就可以被支持.研究了半天都没有更新成功,更新后的版本始终都是1.9.1 :蒙圈了,找 ...
- 初学者易上手的SSH-struts2 01环境搭建
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- eslint使用
参考文档 http://www.cnblogs.com/hahazexia/p/6393212.html http://blog.guowenfh.com/2016/08/07/ESLint-Rule ...