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. [UIKit学习]05.关于plist

    plist是一种iOS本地化轻量级存储方式 创建plist 选择New File-> Resource->plist 加载plist //获得Plist文件的全路径 NSBundle *b ...

  2. 基于c编写的关于随机生成四则运算的小程序

    基于http://www.cnblogs.com/HAOZHE/p/5276763.html改编写的关于随机生成四则运算的小程序 github源码和工程文件地址:https://github.com/ ...

  3. String类的一些转换功能(6)

    1:把字符串转换成字节数组 getBytes() 如: String s = "你好啊!" //编码 byte [] arr = s.getBytes();//这里默认编码格式是g ...

  4. 【京东账户】——Mysql/PHP/Ajax爬坑之页头页尾加载

    一.引言 实现京东的账户项目,有一个小功能,页头页尾加载.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.实现 原理: 用php文件分别写一个的页头和一个页尾,放在前后两个div里. ...

  5. 初识Hibernate之理解持久化类

         上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射.但是至于其中的一些更加细节的地方并没有 ...

  6. How many Knight Placing? UVA - 11091

    How many Knight Placing? Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %l ...

  7. 最长回文 hdu3068(神代码)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. BitmapImage 读取内存流和显示图片

    FileStream filestream = File.OpenRead(@"C:\Users\Administrator\Desktop\queryHeaderImg.png" ...

  9. NOIP初赛 之 逻辑运算

    NOIP初赛 之 逻辑运算 逻辑运算先掌握各种运算,注意运算符的级别比较,做题是要细心.在NOIP中一般一题,分值为1.5分. 概念介绍: 非:not  ¬      与:and ∧      或:o ...

  10. OpenGL ES2.0贴图

    1.定义传入着色器的顶点数据及索引 //传入结构体 typedef struct { ]; ]; } Vertex; //顶点数据 const Vertex Vertices[] = { {{, -, ...