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;
}
};

浙公网安备 33010602011771号