给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 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')