leetcode系列1 1-10

  1. 两数之和
    解题思路:通过新建一个字典将list中的数进行重新存储,数字作为key,索引值作为value,如果已经满足条件就返回,不满足条件就讲数据存到字典中。
#
# @lc app=leetcode id=1 lang=python3
#
# [1] Two Sum
#
# @lc code=start
class Solution:
    def twoSum(self, nums, target) :
        index = {}
        for i, x in enumerate(nums):
            if target - x in index:
                return [index[target - x], i]
            index[x] = i
  1. Add Two Numbers

思路:首先将两个链表中的元素存到一个string中,再将string中的元素存到列岸标中。

#
# @lc app=leetcode id=2 lang=python3
#
# [2] Add Two Numbers
#

# @lc code=start
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None


class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        num1 = ""
        num2 = ""
        while l1:
            num1 += str(l1.val)
            l1 = l1.next
        while l2:
            num2 += str(l2.val)
            l2 = l2.next
        res = str(int(num1[::-1]) + int(num2[::-1]))[::-1]
        head = ListNode(res[0])
        answer = head
        for i in res[1:]:
            node = ListNode(i)
            head.next = node
            head = head.next
        return answer

3. Longest Substring Without Repeating Characters

思路:用一个stack来存储不重复的元素,如果遇到没有见过的直接添加进去,如果遇到了就把之前的删除掉,重新把这个加载进来。

#
# @lc app=leetcode id=3 lang=python3
#
# [3] Longest Substring Without Repeating Characters
#
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        stack = []
        max_len = 0 
        for index, item in enumerate(s):
            if item not in stack:
                stack.append(item)
                max_len = max(max_len , len(stack))
            else:
                idx = stack.index(item)
                stack = stack[idx+1:]
                stack.append(item)
                max_len = max(max_len,len(stack))
        return max_len

4 Median of Two Sorted Arrays

思路:这道题本质是一道二分搜索的题目。因为这两个是有序数组,同时时间复杂度要求log(m+n)。取出整个数列的中值,本质就是从两个数组中分别取出m_1m_2个元素,同时m_1+m_2=k=(n_1+n_2+1)/2,所以关键是要在A、B两个数组中找到分割点,假设从A中选择了m_1个数,从B中选择m_2如果这时候A[m_1]是小于B[m_{2}-1]说明从A中选择的数目偏少,需要增加选择的数量如果B[m_2]小于A[m_{1}-1]表示从A中选择的数据太多,需要减少选择的数量。

image.png

image.png

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):

        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1 
        m,n = len(nums1), len(nums2)
        left_size = (m+n+1) // 2 
        start = 0 
        end = m 
        is_even = ((m+n) %2) == 0 
        while start <= end:
            a_part = (start + end) // 2
            b_part = left_size - a_part

            aleftmax = float("-inf") if a_part == 0 else nums1[a_part - 1]
            arightmin = float("inf") if a_part == m else nums1[a_part]
            bleftmax = float("-inf") if b_part == 0 else nums2[b_part - 1]
            brightmin = float("inf") if b_part == n else nums2[b_part]

            if aleftmax <= brightmin and bleftmax <= arightmin:
                if not is_even:
                    return max(aleftmax, bleftmax)
                else:
                    return (max(aleftmax, bleftmax) + min(arightmin, brightmin)) / 2
            elif aleftmax > brightmin:
                end = a_part - 1
            elif bleftmax > arightmin:
                start = a_part + 1

if __name__ == '__main__':
    nums1, nums2 = [1, 3], [3, 4]
    solu = Solution()
    print(solu.findMedianSortedArrays(nums1, nums2))

5 Longest Palindromic Substring

思路:重复利用已经计算出来的回文子串,考虑 “ababa” 这个示例。如果我们已经知道 “bab” 是回文,那么很明显,“ababa” 一定是回文,因为它的左首字母和右尾字母是相同的。首先考虑两个类型一种是奇数回文,另外一种是偶数回文。
这产生了一个直观的动态规划解法,我们首先初始化一字母和二字母的回文,然后找到所有三字母回文

#

# @lc code=start
class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        maxl, start = 0, 0 
        for i in range(n):
            if i-maxl >= 1 and s[i-maxl-1:i+1] == s[i-maxl-1:i+1][::-1]:
                start = i - maxl - 1 
                maxl += 2 
                continue
            if i - maxl >= 0 and s[i-maxl:i+1] == s[i-maxl:i+1][::-1]:
                start = i - maxl 
                maxl += 1 
        return s[start: start+maxl]

6 ZigZag Conversion

思路:增加一个标志位判断是向上走还是向下走,通过取余操作实现标志位的取值,初始值应该设为-1,因为程序在开始时就会命中换符号的逻辑。

# @lc app=leetcode id=6 lang=python3
#
# [6] ZigZag Conversion
#

# @lc code=start
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows <= 1 or numRows > len(s):
            return s 
        res = [""] * numRows
        line, step = 0, -1
        for c in s:
            res[line] += c 
            if (line) % (numRows-1) == 0:
                step = -step 
            line += step 
        return "".join(res)

7 Reverse Integer

思路:没啥好说的,python切片就可以搞定,唯一需要考虑的就是越界问题

# [7] Reverse Integer
#

# @lc code=start
class Solution:
    def reverse(self, x: int) -> int:
        x = int(str(x)[::-1]) if x >= 0 else - int(str(-x)[::-1])
        return x if x < 2**31 and x >= -2**31 else 0

8 String to Integer (atoi)

思路:处理多种特殊情况

#
# @lc app=leetcode id=8 lang=python3
#
# [8] String to Integer (atoi)
#

# @lc code=start
class Solution:
    def myAtoi(self, s):
        """
        :type str: str
        :rtype: int
        """
        
        if len(s) == 0:
            return 0
        ls = list(s.strip())
        if len(ls) == 0:
            return 0


        sign = -1 if ls[0] == '-' else 1
        if ls[0] in ['-', '+']:
            del ls[0]
        ret, i = 0, 0
        while i < len(ls) and ls[i].isdigit():
            ret = ret*10 + ord(ls[i]) - ord('0')
            i += 1
        return max(-2**31, min(sign * ret, 2**31-1))

9 Palindrome Number

思路负数肯定不是回文数,之后再对正数和0进行判断

#
# @lc app=leetcode id=9 lang=python3
#
# [9] Palindrome Number
#

# @lc code=start
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False 
        else:
            if str(x) == str(x)[::-1]:
                return True 
            else:
                return False 

10 Regular Expression Matching

思路:动态规划令 dp[i][j] 为string s 前i位是否匹配p的前j位,为bool类型,例如dp[1][1]为s[0]、p[0]是否匹配,初始化后剩下的判断分为以下几种情况分析:

  1. p[j] == s[i] 或者 p[j] == '.' #匹配成功跟前面匹配一致
    dp[i+1][j+1] = dp[i][j]
  2. p[j] == '*' 这时又分两种情况
    (1)p[j-1] != s[i] #前的字符匹配0次
    dp[i+1][j+1] = dp[i+1][j-1]
    (2) p[j-1] == s[i] or p[j-1] != '.'
    dp[i+1][j+1] = dp[i][j+1] #该字符出现多次
    or dp[i+1][j+1] = dp[i+1][j] # 字符只出现一次
    or dp[i+1][j+1] = dp[i+1][j-1] # 字符匹配0次
class Solution:
    # @return a boolean
    def isMatch(self, s, pattern):
        dp = [[False] * (len(pattern)+1) for _ in range(len(s)+1)]
        dp[0][0] = True
        for i in range(len(pattern)):
            if pattern[i] == '*' and dp[0][i-1]:
                dp[0][i+1] = True
        for i in range(len(s)):
            for j in range(len(pattern)):
                if pattern[j] == s[i] or pattern[j] == '.':
                    dp[i+1][j+1] = dp[i][j]
                if pattern[j] == '*':
                    if pattern[j-1] != s[i] and pattern[j-1] != '.':
                        dp[i+1][j+1] = dp[i+1][j-1]
                    else:
                        dp[i+1][j+1] = (dp[i][j+1] or dp[i+1]
                                        [j] or dp[i+1][j-1])
        return dp[len(s)][len(pattern)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容