Datawhale-LeetCode编程实践组队学习Task01

2. 两数相加

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry = 0;
        ListNode* ans = new ListNode(0);
        ListNode* p = l1, * q = l2;
        ListNode* h = ans;
        while(p != NULL || q != NULL){
            if(p != NULL){
                carry += p->val;
                p = p->next;
            } 
            if(q != NULL){
                carry += q->val;
                q = q->next;
            } 
            h->next = new ListNode(carry % 10);
            h = h->next;
            carry /= 10;
        }
        if(carry > 0) {
            h->next = new ListNode(carry);
        }
        return ans->next;
    }
};

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

class Solution {
private:
    vector<int> nums1;
    vector<int> nums2;
    int m;
    int n;
public:
    int findMinOfKth(int k)
    {
        int i = 0;
        int j = 0;

        while (k >= 1)
        {
            if (i == m)
            {
                return nums2[j + k - 1];
            }
            else if (j == n)
            {
                return nums1[i + k - 1];
            }
            else if (k == 1)
            {
                return min(nums1[i], nums2[j]);
            }

            int t = k / 2 - 1;
            int _i = min(i + t, m - 1);
            int _j = min(j + t, n - 1);

            if (nums1[_i] >= nums2[_j])
            {
                k -= _j - j + 1;
                j = _j + 1;
            }
            else
            {
                k -= _i - i + 1;
                i = _i + 1;
            }
        }

        return 0;
    }

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        m = nums1.size();
        n = nums2.size();
        if (m == 0 && n == 0)
        {
            return 0.0;
        }
        this->nums1 = nums1;
        this->nums2 = nums2;
        int k = (m + n + 1) / 2;
        if ((m + n) % 2 == 0)
        {
            return (findMinOfKth(k) + findMinOfKth(k + 1)) / 2.0;
        }
        else
        {
            return findMinOfKth(k);
        }
    }
};

5. 最长回文子串

class Solution {
public:
    string longestPalindrome(string s) {
        int len = s.length();
        vector< vector<int> > a(len, vector<int>(len));
        int start(0), l(1);
        for(int i = 0; i < len; i++)
        {
            a[i][i] = 1;
            if(i + 1 < len && s[i] == s[i + 1])
            {
                a[i][i + 1] = 1;
                start = i;
                l = 2;
            }
        }
        for(int r = 3; r <= len; r++)
        {
            for(int i = 0; i < len - r + 1; i++)
            {
                int j = i + r - 1;
                if(s[i] == s[j] && a[i + 1][j - 1] == 1)
                {
                    a[i][j] = 1;
                    start = i;
                    l = r;
                }
                
            }
        }
        return s.substr(start, l);
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43627017/article/details/112504077
今日推荐