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题解(二)的更多相关文章

  1. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  2. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  3. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  4. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  5. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  6. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  7. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  8. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  9. [LeetCode 题解] Search in Rotated Sorted Array

    前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...

  10. 【LeetCode题解】206_反转链表(Reverse-Linked-List)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 git ...

随机推荐

  1. Zabbix 添加脚本检测IP变化

    监控环境 IP和HOSTNAME 有时会有变化.但目前是通过IP地址监控,不是DNS名,添加一个外部脚本,发现IP和HOSTNAME发生变化时告警. vim /usr/local/etc/zabbix ...

  2. Dubbo与Zookeeper、SpringMVC整合和使用

    作为dubbo框架初学者,能让框架跑起来非常不容易,非常感谢网上诸多大神提供的文章,本人参考文章地址是:https://my.oschina.net/xshuai/blog/891281 不过别人的记 ...

  3. D - DZY Loves Hash CodeForces - 447A

    DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert n numbers, in the ...

  4. 封装好的图片滑动框架(AndroidImageSlider)

    前言 广告轮播条的重要性不言而喻.在很多类型app中出场率都很高. 今天给大家介绍一个轮播图开源项目,这个项目把轮播图需要的ViewPager跟计时器做了封装,使用极其方便,支持gradle在线依赖. ...

  5. 【运维】CPU负载

    最近对我的本本(4核8线程)用top命令看系统状况出现了CPU利用率超过200%的情况,非常诧异,查了下相关资料,把这个问题弄清楚了.首先来分析下CPU Load load average: 0.09 ...

  6. WordPress-基础设置之常规设置

    对于第一次使用Wordpress系统的朋友,请先别着急发布文章及进行其他操作,为了更加科学的使用及管理wordpress,应该需要对其进行相关设置,主要涉及3个部分,一.常规设置,二.阅读设置,三.固 ...

  7. Quartz.NET实现作业调度

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  8. Scala基础之注解(annotation

    在学习Scala的过程中,总会碰到一些注解: // Predef.scala @inline def implicitly[T](implicit e: T) = e @deprecated(&quo ...

  9. 使用 Proxy + Promise 实现 依赖收集

    (深入浅出Vue基于“依赖收集”的响应式原理) ,这篇文章讲的是通过一个通俗易懂例子,介绍了 如何用Object.defineProperty 实现的“依赖收集”的原理.Object.definePr ...

  10. python初步(附学习思维导图)

    python,原意为蟒蛇,至于它的发展史,度娘应该比我讲述的更为专业/偷笑.这里我们要梳理的是整个学习的脉络,当然,今后的随笔也会从基础部分说起,希望能给进门python的小伙伴一些建议. 一.环境的 ...