zoukankan      html  css  js  c++  java
  • leetcode题目两数和、最大字符串长度、中位数、最长回文子串

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
    示例:
    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    这道题目比较容易想到的是通过暴力搜索求解,但暴力搜索的时间复杂度为 O(n^2)。
    如果使用哈希的思想,利用Python中list的查询方式,我们可以将复杂度降低到 O(n)。有两个值得注意的地方:

    同样的元素不能重复使用(也就是不能自己加自己)
    给定的数组中可能有相同的元素(比如 [3, 3, 4, 4, 5])
    class Solution:
        """
        给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
        你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
        示例:
        给定 nums = [2, 7, 11, 15], target = 9
        因为 nums[0] + nums[1] = 2 + 7 = 9
        所以返回 [0, 1]
    
        这道题目比较容易想到的是通过暴力搜索求解,但暴力搜索的时间复杂度为 O(n^2)。
        如果使用哈希的思想,利用Python中list的查询方式,我们可以将复杂度降低到 O(n)。有两个值得注意的地方:
    
        同样的元素不能重复使用(也就是不能自己加自己)
        给定的数组中可能有相同的元素(比如 [3, 3, 4, 4, 5])
    
        """
        def twoSum(self, nums, target):
            i = 0
            while i < len(nums):
                if i == len(nums) - 1:
                    return "No solution here!"
                r = target - nums[i]
                # Can't use a num twice
                num_follow = nums[i + 1:]
                if r in num_follow:
                    return [i, num_follow.index(r) + i + 1]
                i = i + 1
    
    if __name__ == '__main__':
        s = Solution()
        print(s.twoSum([3, 3, 4, 4, 5], 9))
    
        给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
        你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
        示例:
        给定 nums = [1,2, 7, 8,11, 15], target = 9
        因为 nums[0] + nums[3] = 2 + 7 = 9
        所以返回 [[0, 3],[1,2]]
    
        这道题目比较容易想到的是通过暴力搜索求解,但暴力搜索的时间复杂度为 O(n^2)。
        如果使用哈希的思想,利用Python中list的查询方式,我们可以将复杂度降低到 O(n)。有两个值得注意的地方:
    b_index=[]
    for i in mylist:
        r=4-i
        if r in mylist :
            b_index.append([mylist.index(i),mylist.index(r)])
            a.append((i,r))
            mylist.remove(i)
    print(b_index)
     最大字符串长度
        给定一个字符串,找出不含有重复字符的最长子串的长度。
        示例:
        给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
        给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
        给定 "himhbgghc" ,最长子串是 "imhbg" ,长度是5。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
    class Solution:
        """
        #最大字串长度
        给定一个字符串,找出不含有重复字符的最长子串的长度。
        示例:
        给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
        给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
        给定 "himhbgghc" ,最长子串是 "imhbg" ,长度是5。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
        """
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
    
            len_s = len(s)
            if len_s == 0:
                return 0
            set_s = set(s)
            # get the max_size of sild window
            max_len = len(set_s)
            max_sub_str = ""
            while max_len:
                if max_len == 1:
                    return 1
                i = 0
                while i + max_len <= len_s:
                    sub_s = s[i:i + max_len]
                    set_sub = set(sub_s)
                    # if there is no repeat in sub string
                    if len(set_sub) == len(sub_s):
                        max_sub_str = sub_s
                        return(len(list(max_sub_str)))
                    i = i + 1
                # adjust the size of window
                max_len = max_len - 1
     
    if __name__ == '__main__':
        s=Solution()
        s.lengthOfLongestSubstring('himhbgghc') # 5 最长字串imhbg 不重复
    中位数是一个可将数值集合划分为相等的上下两部分的一个数值。
    如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;
    如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数。
    输入: 一个作为数组的整数(int)列表(list)的。
    输出: 数组的中位数(int, float).
    class Solution:
        """
        中位数是一个可将数值集合划分为相等的上下两部分的一个数值。
        如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;
        如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数。
        输入: 一个作为数组的整数(int)列表(list)的。
        输出: 数组的中位数(int, float).
        第一种
        """
        def findMedianSortedArraysOne(self, nums1, nums2):
            """
            :type nums1: List[int]
            :type nums2: List[int]
            :rtype: float
            """
            self.nums = nums1 + nums2
            self.nums.sort() #[1,2,3,4]
            size = len(self.nums)
    
            if size % 2 == 1:
                return self.nums[size // 2]
    
            if size % 2 == 0:
                return (self.nums[size // 2] + self.nums[size // 2 - 1]) / 2
        """
        利用了取反数和为1的特性,通过列表负索引来获得列表中位数。
        # 解析:
        if len = 6, half = 3, -half = -4, 此时 ,对中间2个数 data[~half] 和 data[half] 求和,再取平均值
    
        if len = 5, half = 2, ~half = -3, 此时 data[half] = data[~half] ,求和取平均,等于 data[half]
    
        all: half + ~half = -1
        第二种
    
        """
        def findMedianSortedArraysTwo(self, nums1, nums2):
            """
            :type nums1: List[int]
            :type nums2: List[int]
            :rtype: float
            """
            self.nums = nums1 + nums2
            self.nums.sort() #[1,2,3,4]
            size = len(self.nums)
            half = size // 2
            if size % 2 == 1:
                return self.nums[half]
    
            if size % 2 == 0:
                return (self.nums[half] + self.nums[~half]) / 2
    
    if __name__ == '__main__':
        s=Solution()
    s.findMedianSortedArraysOne([1,2,4],[5,6])
    s.findMedianSortedArraysTwo([1,2,4],[5,6])
    最长回文子串
    回文是指正着读和倒着读,结果一些样,比如abcba或abba。
    题目是要在一个字符串中要到最长的回文子串。
    最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。
    求每一个子串时间复杂度O(N^2),判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。
    class Solution:
        """
            最长回文子串
            回文是指正着读和倒着读,结果一些样,比如abcba或abba。
            题目是要在一个字符串中要到最长的回文子串。
            最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。
            求每一个子串时间复杂度O(N^2),判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。
        """
        def longestPalindrome(self, s):
            """
            :type s: str
            :rtype: str
            """
            s = s
            mlen = len(s)
            while True:
                i = 0
                while i + mlen <= len(s):
                    sl = s[i:i + mlen]
                    sr = sl[::-1]
                    if sl == sr:
                        return sl
                    i = i + 1
                mlen = mlen - 1
                if mlen == 0:
                    return "No solution"
    
    if __name__ == '__main__':
        s=Solution()
        s.longestPalindrome('himhbggbc') 

    第二种
    class
    Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ # 使用动态规划,用空间换时间,把问题拆分 # 获取字符串s的长度 str_length = len(s) # 记录最大字符串长度 max_length = 0 # 记录位置 start = 0 # 循环遍历字符串的每一个字符 for i in range(str_length): # 如果当前循环次数-当前最大长度大于等于1 并 字符串[当前循环次数-当前最大长度-1:当前循环次数+1] == 取反后字符串 if i - max_length >= 1 and s[i-max_length-1: i+1] == s[i-max_length-1: i+1][::-1]: # 记录当前开始位置 start = i - max_length - 1 # 取字符串最小长度为2,所以+=2,s[i-max_length-1: i+1] max_length += 2 continue # 如果当前循环次数-当前最大长度大于等于0 并 字符串[当前循环次数-当前最大长度:当前循环次数+1] == 取反后字符串 if i - max_length >= 0 and s[i-max_length: i+1] == s[i-max_length: i+1][::-1]: start = i - max_length # 取字符串最小长度为1,所以+=1,s[i-max_length: i+1] max_length += 1 # 返回最长回文子串 return s[start: start + max_length] if __name__ == '__main__': s = "babad" # s = "cbbd" sl = Solution() print(sl.longestPalindrome(s))
    第三种
    根据回文串对称性,分为奇数长度回文串和偶数长度回文串
    
    def match(s):
        res=0
        for i in range(len(s)-1):
            if s[i]==s[i+1]:#奇数长度
                first=i
                end=i+1
                while first>=0 and end<len(s) and s[first]==s[end]:
                #满足条件就向两边扩展
                    first-=1
                    end+=1
                res=max(res,end-first-1)
            elif s[i-1]==s[i+1]:#偶数长度
                first=i-1
                end=i+1
                while first>=0 and end<len(s) and s[first]==s[end]:
                    first-=1
                    end+=1
                res=max(res,end-first-1)
        return res
    match('abba')
     
     
    
    
     
  • 相关阅读:
    建议自学
    大牛之术
    学习榜样
    .net源码
    练习题
    学习-如何克服拖延
    如何解决困难问题
    最近阅读
    如何学习一门新语言
    安全问题关注博客
  • 原文地址:https://www.cnblogs.com/liang715200/p/15173538.html
Copyright © 2011-2022 走看看