LeetCode100道 day02
1. 寻找两个正序数组的中位数
-
给定两个大小分别为
m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数 组的 中位数 。 -
算法的时间复杂度应该为
O(log (m+n))。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] nums3=new int[nums1.length+nums2.length];
for (int i = 0; i <nums1.length; i++) {
nums3[i]=nums1[i];
}
for (int i = 0; i <nums2.length; i++) {
nums3[nums1.length+i]=nums2[i];
}
Arrays.sort(nums3);
double cc=nums3.length %2;
if(cc==0){
double a=nums3.length/2-1;
Integer k=(int)a;
double b=nums3.length/2;
Integer v=(int)b;
double ddd=(nums3[k]+nums3[v]);
return (ddd/2);
}else {
double c=nums3.length/2;
Integer pp =(int)(c+0.5);
return nums3[pp];
}
}
}
2. 最长回文子串
- 给你一个字符串
s,找到s中最长的回文子串。
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return "";
}
// 保存起始位置,测试了用数组似乎能比全局变量稍快一点
int[] range = new int[2];
char[] str = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
// 把回文看成中间的部分全是同一字符,左右部分相对称
// 找到下一个与当前字符不同的字符
i = findLongest(str, i, range);
}
return s.substring(range[0], range[1] + 1);
}
public static int findLongest(char[] str, int low, int[] range) {
// 查找中间部分
int high = low;
while (high < str.length - 1 && str[high + 1] == str[low]) {
high++;
}
// 定位中间部分的最后一个字符
int ans = high;
// 从中间向左右扩散
while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
low--;
high++;
}
// 记录最大长度
if (high - low > range[1] - range[0]) {
range[0] = low;
range[1] = high;
}
return ans;
}
}
3. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
示例 2:
输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入: s = "A", numRows = 1
输出: "A"
提示:
1 <= s.length <= 1000s由英文字母(小写和大写)、','和'.'组成1 <= numRows <= 1000
- 这道题花费了一些时间没解出来,看题解顿有所悟,希望多加练习吧
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1) return s; //如果它的字符串只有一行那么就直接返回字符串s;
vector<string>rows(numRows); //存放每行字符串的数组
int flag=1; //转向的标志 等于1时从上往下遍历 等于-1时从下往上
int index=0;//表示当前的行数
for(int i=0;i<s.size();i++)
{
rows[index].push_back(s[i]); //依次添加 0行 1行 2行....numROQs行的元素
index+=flag;
if(index==numRows-1 ||index==0) //如果到了最后一行那就要转向 从下往上 又回到第一行后再次转向 由上往下 如此往复循环
{
flag=-flag;
}
}
string res; //存放结果的字符串
for(auto c:rows) //依次遍历
{
res+=c;
}
return res;
}
};