Leetcode 03 最长不重复子串
第一反应就是动态规划。看到了网上的方法一。
直接把问题简化为找两个重复字符间的最长距离,太巧妙了!
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int locs[256];//记录字符上一次出现的位置
memset(locs,-1,sizeof(locs));
int idx=-1;//记录当前子串开始位置-1
int max=0;
for(int i=0;i<s.size();i++)
{
if(locs[s[i]]>idx)
{
idx=locs[s[i]];
}
if (i-idx>max)
{
max=i-idx;
}
locs[s[i]] = i;
}
return max;
}
};
ling老师的方法二:
仍旧转化为动态规划,但是为节省空间不再开个数组记录字符位置(?),采用了从后往前的遍历。代码在知乎专栏。
LeetCode 4
class Solution {
public:
double find(vector<int> &a,int lena,vector<int> &b,int lenb,int k)
{
int i=0,j=0;
while(i<lena&&j<lenb)
{
k--;
if(a[i]<b[j])
{
if(k==0)
{
return a[i];
}
else
{
i++;
}
}
else
{
if(k==0)
{
return b[j];
}
else
{
j++;
}
}
}
if(i>=lena)
{
return b[j+k-1];
}
else
{
return a[i+k-1];
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
if((m+n)%2==1)
{
return find(nums1,m,nums2,n,(m+n+1)>>1);
}
else
{
return ((find(nums1,m,nums2,n,(m+n)>>1)+find(nums1,m,nums2,n,((m+n)>>1)+1))*0.5);
}
}
};
分治法