2023/07/02 leetcode刷题记录

1 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
执行用时:16 ms, 在所有 C++ 提交中击败了71%的用户
内存消耗:7.3 MB, 在所有 C++ 提交中击败了83%的用户

代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //解题思路:
        //先向右遍历两层,找到每一个字符向右最近的相同字符
        //找到以这个字符开始的之后不再包含这个字符的最长子串的长度,记录在数组k中
        //再向左遍历数组k,如果k[i+1] < k[i]-1,说明i开始的最长子串中间存在s[i+!]的重复字符
        //更新s[i]=s[i+1]+1
        vector<int> k(s.size(),0);
        for(int i = 0; i < s.size(); i++) {
            int j = i+1;
            for(; j < s.size(); j++) {
                if(s[i] == s[j]) {
                    break;
                }
            }
            k[i] = j-i;
        }
        for(int i = k.size() - 2; i >= 0; i--) {
            if(k[i+1] < k[i]-1) {
                k[i] = k[i+1] + 1;
            }
        }
        int maxLength = 0;
        for(int i = 0; i < k.size(); i++) {
            if(k[i] > maxLength) {
                maxLength = k[i];
            }
        }
        return maxLength;
    }
};

2 两数相加

时间:24ms 81%
内存:69.6MB 82%

代码 ``` /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *sum = new ListNode(0); ListNode *p = sum; int over = 0; //记录进位 while(1) { p->val = l1->val + l2->val + over; if(p->val >= 10) { p->val = p->val-10; over = 1; } else over=0; l1 = l1->next; l2 = l2->next; if(l1!=nullptr && l2!=nullptr) { p->next = new ListNode(0); p = p->next; } else break; } if(l1 != nullptr) { ListNode * last = l1; while(over == 1) { l1->val += 1; if(l1->val>=10) { l1->val -= 10; over = 1; } else over = 0; if(l1->next == nullptr && over == 1) { l1->next = new ListNode(1); over = 0; } l1 = l1->next; } p->next = last; } else if(l2 != nullptr){ ListNode * last = l2; while(over == 1) { l2->val += 1; if(l2->val>=10) { l2->val -= 10; over = 1; } else over = 0; if(l2->next == nullptr && over == 1) { l2->next = new ListNode(1); over = 0; } l2 = l2->next; } p->next = last; } else if(over != 0) { // 如果两个链都加到尽头,但存在进位。 p->next = new ListNode(1); } return sum; } }; ```

3 寻找两个正序数组的中位数

执行用时:20 ms, 在所有 C++ 提交中击败了91.59%的用户
内存消耗:87.2 MB, 在所有 C++ 提交中击败了55.23%的用户

代码
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int d = (nums1.size() + nums2.size() - 1) / 2;
        bool average = (nums1.size() + nums2.size()) % 2;
        int j1 = 0, j2 = 0;
        int max1 = 0, max2 = 0;
        if(nums1.size()==0 && nums2.size()==0) 
        {
            return 0;
        }
        else if(nums1.size()==0)
        {
            return average ? nums2[d] : ((float)nums2[d] + nums2[d+1]) /2;
        }
        else if(nums2.size()==0)
        {
            return average ? nums1[d] : ((float)nums1[d] + nums1[d+1]) /2;
        }
        for(int i = 0; i <= d + 1; i++)
        {
            if(j1 >= nums1.size()) {
                if(i == d+1) {
                    max1 = max2;
                    max2 = nums2[j2];
                }
                else {
                    max1 = nums2[j2 + d - i];
                    max2 = nums2[j2 + d + 1 -i];
                }
                break;
            }
            else if(j2 >= nums2.size()) {
                if(i == d+1) {
                    max1 = max2;
                    max2 = nums1[j1];
                }
                else {
                    max1 = nums1[j1 + d - i];
                    max2 = nums1[j1 + d + 1 -i];
                }
                break;
            }
            if(nums1[j1] <= nums2[j2]) {
                max1 = max2;
                max2 = nums1[j1];
                j1++;
            }
            else {
                max1 = max2;
                max2 = nums2[j2];
                j2++;
            }
        }
        return average ? max1 : ((float)max1+max2)/2;
    }
};
posted @ 2023-07-02 01:59  三文咸鱼  阅读(17)  评论(0)    收藏  举报