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