练习leetcode题库3,4,33,34

题目链接3.无重复字符的最长子串
https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
通过滑动窗口找出最长的不重复子字符串,从左向右依次移动右指针,进行每次碰到重复,移动左指针知道元素无重复,更新子串同时更新最大长度。

点击查看代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        set<char> window;
        int n = s.length();
        int l = 0, r = 0, max = 0;
         while(r < n){
                if(!window.count(s[r])){
                    window.insert(s[r]);
                    if(r - l + 1 > max){
                        max = r - l + 1;
                    }
                    r++;
                }else{
                    window.erase(s[l]);
                    l++;
                }
            }
        return max;
    }
};

4.寻找两个正序数组的中位数
https://leetcode.cn/problems/median-of-two-sorted-arrays/description/
先合并两个数组到新的数组,再找中位数。

点击查看代码
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        vector<int> a;
        double mid;
        for(int i = 0; i < m; i++){
            a.push_back(nums1[i]);
        }
        for(int i = 0; i < n; i++){
            a.push_back(nums2[i]);
        }
        sort(a.begin(),a.end());
        if((m + n) % 2 == 0){
            mid = (a[(m + n) / 2] + a[(m + n) / 2 - 1]) / 2.0;
        }else{
            mid = a[(m + n) / 2];
        }
        return mid;
    }
};

33.搜索旋转排序数组
https://leetcode.cn/problems/search-in-rotated-sorted-array/
遍历数组确定目标target是否存在于数组。

点击查看代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
       for(int i = 0; i < nums.size(); i++){
                if(nums[i] == target){
                    return i;
                }
        } 
        return -1;
    }
};

34.在排序数组中查找元素的始末位置
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
用二分法分开查找目标target的始末位置。
找起点位置时每次找到移动向左左指针,直到确定起点位置;同理,终点位置边界向右移动直到找到终点位置。

点击查看代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(find(nums.begin(), nums.end(), target) == nums.end()){
            return {-1, -1};
        }else{
            int s = -1, e = -1;
            int l = 0, r = nums.size() - 1;
            while (l <= r){
                int mid = (l + r) / 2;
                if (nums[mid] == target){
                    s = mid;
                    r = mid - 1; 
                }else if(nums[mid] < target){
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            l = 0, r = nums.size() - 1;
            while(l <= r){
                int mid = (l + r) / 2;
                if (nums[mid] == target){
                    e = mid;
                    l = mid + 1; 
                }else if(nums[mid] < target){
                    l = mid + 1;
                }else{
                    r = mid - 1;
                }
            }
            return {s, e};
        }
    }
};
posted @ 2025-07-24 22:16  sirro1uta  阅读(12)  评论(0)    收藏  举报