Leetcode_Python_2.0

1. Two Sum

难度: Easy

思路:用空间复杂度换取时间复杂度,字典

 #for循环,从i+1开始
 for j in range(i+1,  len(nums)):   # 不要忘记加冒号

#可以直接返回数组,循环中执行到return语句则跳出循环
return [i,  j]
# enumerate() 函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
for i, num in enumerate(nums):

#新建字典
look_up = {}

#给字典添加元素
look_up[num] = i  #{num: i}


2. Add Two Numbers

难度: 中等

思路:使用递归,每次计算一位相加

# 如果l1为Falsely则执行
if not l1:

# 将val1数组中的元素逆序合并成一个字符串
num1 = ''.join([str(i) for i in val1[::-1]])

#将字符串形式的数字相加,然后逆序组成新的字符串
tmp = str(int(num1) + int(num2))[::-1]

3. Longest Substring Without Repeating Characters

难度: Medium

猜想:从第一个字符开始计算它往后不重复相连字符的数量,更新这个最大值

思路:1. 贪婪算法; 2. slide window 全家桶

# 返回字典中指定键的值,如果值不在字典中返回默认值-1。
 maps.get(s[i], -1)

# 获取最大值
max(a, b)

5. Longest Palindromic Substring

难度: Medium

猜想:找子字符串+回文的判定条件

思路:Manacher algorithm,马拉车算法,时间复杂度为o(n)

# S = "abba", T = "^#a#b#b#a#$"
T = '#'.join('^{}$'.format(s))

class Solution:
    #Manacher algorithm
    
    def longestPalindrome(self, s):
        # Transform S into T.
        # For example, S = "abba", T = "^#a#b#b#a#$".
        # ^ and $ signs are sentinels appended to each end to avoid bounds checking
        T = '#'.join('^{}$'.format(s))
        n = len(T)
        P = [0] * n
        C = R = 0
        for i in range (1, n-1):
            P[i] = (R > i) and min(R - i, P[2*C - i]) # equals to i' = C - (i-C)
            # Attempt to expand palindrome centered at i
            while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
                P[i] += 1

            # If palindrome centered at i expand past R,
            # adjust center based on expanded palindrome.
            if i + P[i] > R:
                C, R = i, i + P[i]
    
        # Find the maximum element in P.
        maxLen, centerIndex = max((n, i) for i, n in enumerate(P))
        return s[(centerIndex  - maxLen)//2: (centerIndex  + maxLen)//2]

6. ZigZag Conversion

难度: 中等

思路:纵向思维考虑,index从0开始,我们要一直自增直到numRows-1,此后又一直自减到0,重复执行。分别往4个子字符串里面添加字母,最后再合并成一个字符串

# 把列表合成字符串
''.join(res)

#创建n维空列表
res = [''] * numRows

7. Reverse Integer 反转整数

难度: Easy

思路:取绝对值,逆序

# 除去这行文本的最后一个字符
line[:-1]

8. String to Integer (atoi)

难度: Medium

# 移除字符串头尾指定的字符序列
str.strip()

# 返回对应的 ASCII 数值,或者 Unicode 数值
ord()

11. Container With Most Water

难度: Medium

由于ai和aj (i<j) 组成的container的面积:S(i,j) = min(ai, aj) * (j-i)

当height[left] < height[right]时,对任何left < j < right来说

1. min(height[left], height[j]) <= height[left] = min(height[left], height[right])
2. j - left < right - left

所以S(left, right) = min(height[left], height[right]) * (right-left) > S(left, j) = min(height[left], height[j]) * (j-left)

12. Integer to Roman

难度: Medium

# 第一个参数传给第二个参数“键-键值”
# 第二个参数取出其中的键([0])或键值(1])
sorted(lookup.items(), key = lambda t: t[1]) 

15. 3Sum

难度: Medium

  • 排序
  • 固定左边,如果左边重复,继续
  • 左右弄边界,去重,针对不同的左右边界情况处理
# 给数组排序,升序
nums.sort()
sorted(nums)

16. 3Sum Closest

难度: Medium

float('inf') #浮点数最大值
abs() #python自带的绝对值函数,不需要numpy
while i > 0 and nums[i] == nums[i-1]:
  continue

# 错误操作
# 在while循环内部必须要接能够使#得条件不满足的语句,不然会死循环
# 如果有continue,则该语句必须在continue前面

17. Letter Combinations of a Phone Number

难度: Medium

思路:定义一个迭代函数

## 字典中每一组键值对后面用逗号隔开
        lookup = {
            '2' : ['a', 'b', 'c'],
            '3' : ['d', 'e', 'f'],
            '4' : ['g', 'h', 'i'],
            '5' : ['j', 'k', 'l'],
            '6' : ['m', 'n', 'o'],
            '7' : ['p', 'q', 'r', 's'],
            '8' : ['t', 'u', 'v'],
            '9' : ['w', 'x', 'y', 'z']     
        }

18. 4Sum

难度: Medium

思路: 迭代,可推广至NSum问题

    def findNsum(nums, target, N, result, results):
        if len(nums) < N or N < 2 or target < nums[0]*N or target > nums[-1]*N:  # early termination
            return
        if N == 2: # two pointers solve sorted 2-sum problem
            l,r = 0,len(nums)-1
            while l < r:
                s = nums[l] + nums[r]
                if s == target:
                    results.append(result + [nums[l], nums[r]])
                    l += 1
                    while l < r and nums[l] == nums[l-1]:
                        l += 1
                elif s < target:
                    l += 1
                else:
                    r -= 1
        else: # recursively reduce N
            for i in range(len(nums)-N+1):
                if i == 0 or (i > 0 and nums[i-1] != nums[i]):
                    findNsum(nums[i+1:], target-nums[i], N-1, result+[nums[i]], results)   #往数组里面添加数组

    results = []
    findNsum(sorted(nums), target, 4, [], results)   
    return results
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容