LeetCode HOT 100 --- 2021/8/9

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

在这里插入图片描述
方法一:
  先按照合并两个有序链表的方式合并两个数组,然后再求中位数。
代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int m = nums1.size(), n = nums2.size();
        int i = 0, j = 0;
        while(i < m && j < n) {
            if(nums1[i] < nums2[j]) {
                res.push_back(nums1[i]);
                i++;
            }else {
                res.push_back(nums2[j]);
                j++;
            }
        }
        if(i < m) {
            for(int k = i; k < m; k++) {
                res.push_back(nums1[k]);
            }
        }else if(j < n){
            for(int k = j; k < n; k++) {
                res.push_back(nums2[k]);
            }
        }
        int mid = (m + n) / 2;
        if((m + n) & 1) {     
            return 1.0 * res[mid];
        }else {
            return (res[mid - 1] + res[mid]) / 2.0;
        }
    }
};

方法二:
  可以不合并两个链表,只要找到相应的位置下标即可,思想同方法一。

合并K个升序链表

在这里插入图片描述
方法一:
  循环合并。
代码:

/**
 * 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* merge(ListNode* head1, ListNode* head2) {
        ListNode* head = new ListNode();
        ListNode* ptr = head;
        while(head1 && head2) {
            if(head1->val < head2->val) {
                ptr->next = head1;
                head1 = head1->next;
            }else {
                ptr->next = head2;
                head2 = head2->next;
            }
            ptr = ptr->next;
        }
        ptr->next = head1 == nullptr ? head2 : head1;
        return head->next;
    }
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int n = lists.size();
        if(n == 0) {
            return nullptr;
        }
        if(n == 1) {
            return lists[0];
        }
        ListNode* res = lists[0];
        for(int i = 1; i < n; i++) {
            res = merge(res, lists[i]);
        }
        return res;
    }
};

方法二:
  归并合并。
代码:

/**
 * 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* merge(ListNode* head1, ListNode* head2) {
        ListNode* head = new ListNode();
        ListNode* ptr = head;
        while(head1 && head2) {
            if(head1->val < head2->val) {
                ptr->next = head1;
                head1 = head1->next;
            }else {
                ptr->next = head2;
                head2 = head2->next;
            }
            ptr = ptr->next;
        }
        ptr->next = head1 == nullptr ? head2 : head1;
        return head->next;
    }
    
    ListNode* mergeSort(vector<ListNode*>& lists, int l, int r) {
        if(l > r) {
            return nullptr;
        }
        if(l == r) {
            return lists[r];
        }
        int mid = l + (r - l) / 2;
        return merge(mergeSort(lists, l, mid), mergeSort(lists, mid + 1, r));
    }
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int n = lists.size();
        return mergeSort(lists, 0, n - 1);
    }
};

最长有效括号

在这里插入图片描述
分析:
  参考官方题解。
代码:

class Solution {
public:
    int longestValidParentheses(string s) {
        int maxans = 0;
        stack<int> stk;
        stk.push(-1);
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                stk.push(i);
            } else {
                stk.pop();
                if (stk.empty()) {
                    stk.push(i);
                } else {
                    maxans = max(maxans, i - stk.top());
                }
            }
        }
        return maxans;
    }
};
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值