leetcode 4
寻找两个有序数组的中位数
这题的思路类似归并排序,设k为两个数组长度和,找中位数等于找第k/2和(k+1)/2两个数。
在算法中学过查找两个有序数组的第K小元素,可以采用二分的思想。
找取p=k/2时 数组nums1和nums2的第p个元素。
若 nums1[p]>nums2[p] ,则说明nums2前面p个元素都不是第k小元素。
于是可以把数组b的前p个元素舍去,将k=k-p;
在实现时可以采用地柜的方法,类似于二分。
code:
class Solution {
public int get(int[] nums1,int n1,int s1,int[] nums2,int n2,int s2,int k)
{
int len1=n1-s1+1;
int len2=n2-s2+1;
if(len1>len2) return get(nums2,n2,s2,nums1,n1,s1,k);
if(len1==0) return nums2[s2+k-1];
if(k==1) return Math.min(nums1[s1],nums2[s2]);
int x1=s1 + Math.min(len1,k/2)-1;
int x2=s2 + Math.min(len2,k/2)-1;
if(nums1[x1]>nums2[x2]) return get(nums1,n1,s1,nums2,n2,x2+1,k-(x2+1-s2));
else return get(nums1,n1,x1+1,nums2,n2,s2,k-(x1+1-s1));
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n1=nums1.length;
int n2=nums2.length;
int m1=(n1+n2+1)/2;
int m2=(n1+n2+2)/2;
return (get(nums1,n1-1,0,nums2,n2-1,0,m1)+get(nums1,n1-1,0,nums2,n2-1,0,m2))*0.5;
}
}
leetcode 5
最长回文子串
此题最简单思路是 对于任一字符其前字符等于后一字符,或者后一字符与其相等,则是回文串。
即:存在s[n],if s[n-1]==s[n+1] or s[n]=s[n=1] then s[n-1,n+1] or s[n,n+1]是回文串
根据这个思路 遍历所有字符 即可得出最长回文子串。
code:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len == 0) return "";
int max=0;
int r=0;
int l=0;
for(int i=0;i<len-1;i++)
{
int p=2;
int j=i;
for(;j<len-1;j++)
{
if(s.charAt(i)==s.charAt(j+1))
{
p++;
if(p>max)
{
l=i;
r=j+1;
max=p;
}
}
else break;
}
for(int k=1;i-k>=0&&j+k<len;k++)
{
if(s.charAt(i-k)==s.charAt(j+k))
{
p+=2;
if(p>max)
{
l=i-k;
r=j+k;
max=p;
}
}
else break;
}
}
return s.substring(l,r+1);
}
}
稍微改进一点若判断过连续字符则下一次从不连续字符开始。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len == 0) return "";
int max=0;
int r=0;
int l=0;
for(int i=0;i<len-1;i++)
{
int p=2;
int j=i;
for(;j<len-1;j++)
{
if(s.charAt(i)==s.charAt(j+1))
{
p++;
if(p>max)
{
l=i;
r=j+1;
max=p;
}
}
else break;
}
for(int k=1;i-k>=0&&j+k<len;k++)
{
if(s.charAt(i-k)==s.charAt(j+k))
{
p+=2;
if(p>max)
{
l=i-k;
r=j+k;
max=p;
}
}
else break;
}
i=j;
}
return s.substring(l,r+1);
}
}
leetcode 6
Z 字形变换
简单思路:
根据z字型顺序,逐步将字符拼接到每一层的字符串中,但空间开销大
code:
class Solution {
public String convert(String s, int numRows) {
if(numRows==1) return s;
StringBuilder [] sl=new StringBuilder[numRows];
for(int i=0;i<numRows;i++)
{
sl[i]=new StringBuilder();
}
boolean k=true;
int p=0;
for(int i=0;i<s.length();i++)
{
if(k==true)
{
sl[p].append(s.charAt(i));
p++;
if(p==numRows-1) k=false;
}
else
{
sl[p].append(s.charAt(i));
p--;
if(p==0) k=true;
}
}
StringBuilder sp=new StringBuilder();
for(int i=0;i<numRows;i++)
{
sp.append(sl[i]);
}
return new String(sp);
}
}