【LeetCode 4-5】4.Median of Two Sorted Arrays 5.Longest Palindromic Substring

来源:互联网 发布:sqlserver 图标 编辑:程序博客网 时间:2024/06/06 02:06

4.Median of Two Sorted Arrays

这题在网站上标注的难度为hard,实际则不难。

一句话思路:因为两个数组已经排序了,只需从小到大取 (len1+len2)/2+1个数,组成一个新合并数组,保存最后的两位结果,然后根据len1+len2是奇数还是偶数取最后一位或者两位的平均数即可。


这是我第一次写的代码: 时间复杂度应该是O(length)吧,空间都是常数,应该是O(1),但是提交后,发现运行时间长,只击败了5.78%

class Solution {public:    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int length = (nums1.size() + nums2.size()) / 2 + 1;        double result[2];        int len1 = 0, len2 = 0, i = 0;                while(i < length){               while (i < length && len1 < nums1.size() && len2 < nums2.size() && nums1[len1] <= nums2[len2]) {                result[i%2] = nums1[len1];                 len1++; i++;            }            while (i < length && len1 < nums1.size() && len2 < nums2.size() && nums1[len1] > nums2[len2]){                result[i%2] = nums2[len2];                len2++; i++;            }            while (i < length && len1 >= nums1.size() && len2 < nums2.size()){                result[i%2] = nums2[len2];                len2++; i++;            }            while (i < length && len2 >= nums2.size() && len1 < nums1.size()){                result[i%2] = nums1[len1];                len1++; i++;            }         }                double db = (nums1.size() + nums2.size()) % 2 == 0 ? (double(result[0] + result[1]) /2 ) : max(result[0],result[1]);                return db;    }};


5.Longest Palindromic Substring

一句话思路:回文字符串,一个很自然的想法就是一边从头开始扫描,一边为尾巴开始扫描,使用一个O(n^2)的算法进行枚举,但是超时了,用来想用multimap来保存相同字符串的下标,减少一层循环,不过想到类似“1111111111111111111111……111“这种情况,最坏情况还是会出现O(n^2),最后通过加了一个对最大长度的判断,小优化卡过 看了结果,竟然还击败了21%的结果!


class Solution {public:    string longestPalindrome(string s) {        int maxstart = 0, maxsize = 1;        for(int i = 0; i < s.size(); i++){            for(int j = s.size() - 1; j > i && j - i + 1 > maxsize ; j--){                if(s[i] == s[j] && isPalin(s, i, j)){                                            maxsize = j - i + 1;                        maxstart = i;                        break;                                    }            }        }        return s.substr(maxstart, maxsize);    }        bool isPalin(const string& s, int i, int j){        int size = j - i + 1;        if(size % 2 == 0){            while(s[i] == s[j] && i < j -1 ){                i++; j--;            }            if(s[i] == s[j] && i == j - 1)                return true;        }        if(size % 2 == 1){            while(s[i] == s[j] && i != j){                i++; j--;            }            if(i == j)                return true;        }        return false;    }    };


看了下讨论区的代码,另外一种比较巧妙的实现方法,从回文传的中间往左右两边检查,速度更快,而且可以省去判断字符串长度奇偶数的问题

同时,在循环里关于maxlen的判断,使用size - i > maxlen / 2,更明显

class Solution {public:    std::string longestPalindrome(std::string s) {        if (s.size() < 2)            return s;        int len = s.size(), max_left = 0, max_len = 1, left, right;        for (int start = 0; start < len && len - start > max_len / 2;) {            left = right = start;            while (right < len - 1 && s[right + 1] == s[right])   //对于往右扩展遇到相邻的字符串是相同的,一定都是回文串,形如 x‘bbb’y 或'x 'bbbb' y                ++right;            start = right + 1;            while (right < len - 1 && left > 0 && s[right + 1] == s[left - 1]) {                ++right;                --left;            }            if (max_len < right - left + 1) {                max_left = left;                max_len = right - left + 1;            }        }        return s.substr(max_left, max_len);    }};


7.Reverse Integer   

比较简单的一题,有两处想复杂了,一是一开始就想着转成字符串去处理,然后一直在找int和string之间的转换的函数,第二是关于overflow的判断,溢出后应该是会变为负数之类的,而不是直接崩溃,直接如以下代码中判断是否与自己预期的数相等即可

class Solution {public:    int reverse(int x) {        int ans = 0;        while(x){            int temp = ans * 10 + x % 10;            if(temp / 10 != ans) return 0;            ans = temp;            x = x /10;        }        return ans;    }};


原创粉丝点击