LeetCode【3--无重复的最长字串】 LeetCode【4--有序数组中的中位数】

无重复的最长字串

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述

解题思路

看到这道题,其实就两个步骤,遍历字符串,记录当前字符有没有重复。
重复一般解决就是哈希,这里用个数组表示。
这里找最长的字串,就是一个滑动窗口,我们在这里用两个下标表示,一个为左边界,一个为右边界,
初始值left = 0,right = -1;
滑动窗口的滑动就是,右边界扩大,左边界缩小
拿abcabcbb举例

  1. 先扩大右边界看有没有越界right+<s.size() 然后要看当前字符a在哈希表中有没有重复出现count[s[right+1]] == 0,如果没有,那么count[s[++right]]++; 就是右边界可以扩大,并且标记a已重复
  2. 第一步完成后,right = 0,left = 0 ,重复上述步骤,判断right+1<size&&count[s[right+1]] == 0,成功后b也没有重复,那么右边界再往右扩一个
  3. 第二步完成后,right = 1,left = 0,再重复上述步骤,判断rihgt+1<size&&count[s[right+1]] == 0, c也没有重复,右边界再往右扩一个
  4. 第三部完成后,right = 2,left = 0,再重复上述步骤,判断right+1<size&&count[s[right+1]] == 0,此时又判断到了a,那么count[s[left++]] --,缩小左边界,同时把哈希中的值更改
  5. 。。。。。往后重复此操作
  6. 每一步操作都要比较旧窗口大小和新窗口大小,就是max(旧的,新的),找出最大值

代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int count[256] = {0}; //哈希
        int right = -1; //右边界
        int left = 0;//左边界
        int res = 0; //窗口大小
        while(left<s.size())
        {
            if(right+1<s.size()&&count[s[right+1]] == 0)
                count[s[++right]] ++;
            else
                count[s[left++]]--;
            res = max(res,right-left+1);
        }
        return res;
    }
};

有序数组中的中位数

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

在这里插入图片描述

解题思路

所有的数据结构的中位数都可以用两个函数解决,就是剑指offer中的数据流中的中位数
具体思路点这里

代码实现

class Solution {
    priority_queue<int,vector<int>,less<int>> max;
    priority_queue<int,vector<int>,greater<int>> min;
public:
    void Insert(int num)
    {
        if(max.empty() || num<= max.top())
            max.push(num);
        else
            min.push(num);
        
        //保证两个堆的元素个数之差小于1
        if(max.size() == min.size()+2)
        {
            min.push(max.top());
            max.pop();
        }
        if(max.size()+1 == min.size())
        {
            max.push(min.top()); 
            min.pop();
        }
    }
    double GetMedian()
    { 
        return max.size() == min.size() ? (max.top()+min.top())/2.0 : max.top();
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        for(int i = 0; i<nums1.size();++i)
        {
            Insert(nums1[i]);
        }
        for(int i = 0;i<nums2.size();++i)
        {
            Insert(nums2[i]);
        }
        double res =GetMedian();
        return res;
    }
};
发布了253 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liuyuchen282828/article/details/104540672
今日推荐