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循环就不要用!

 

posted @ 2019-08-02 11:40  知其然,知其所以然。  阅读(195)  评论(0编辑  收藏  举报