Leetcode 初刷(1)
1、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法1:思路简单,时间复杂度高 用时:3124ms,内存:12.5MB
def twoSum2(nums,target):#3124ms,12.5MB for i in range(0,len(nums)): tmp = target - nums[i] for j in range(i+1,len(nums)): if tmp == nums[j]: return [i,j]
方法2:将只要读取到的数据就存入字典,提高效率 用时:60ms,内存:13MB
def twoSum(nums,target):#60ms 13MB d = {} for i in range(0,len(nums)): tmp = target - nums[i] if tmp in d: return [d[tmp],i] else: d[nums[i]] = i
2、给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
方法1:超出时间限制
def lengthOfLongestSubstring(s):#超出时间限制 max_len = 0 for i in range(0,len(s)): res = '' for j in range(i,len(s)): if s[j] in res: break else: res += s[j] if len(res) > max_len: max_len = len(res) return max_len
方法2:利用index找到未重复字符的下一个开始存储到l(l中存的都是不重复子串),理解起来也很简单,用时:64ms,内存:12.2MB
def lengthOfLongestSubstring4(s): # 'dvdf' 从上一个重复位置开始!!! l = [] res = [] for x in s: if x not in l: l.append(x) else: res.append(len(l)) i = l.index(x) l = l[i + 1:] l.append(x) res.append(len(l)) return max(res) if res else 0
继续加油!在实际代码中能不用双重for循环就不要用!