LeetCode 边学python边练算法(持续更新)

1 篇文章 0 订阅
1 篇文章 0 订阅

LeetCode 边学python边练算法(持续更新)


1、两数之和

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3]
nums2 = 2
中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5

我的代码

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        end=0
        map = {}
        key = 0
        for num in nums:
            if target-num in map :
                key = target-num
                break
            else:
                map[num] = end;
            end+=1

        start = map[key]
        result = [start,end]
        return result

知识点

字典
  • 定义

    map = {}

  • 遍历

  • 存数据
  • 取数据
数组
  • 定义
  • 遍历
  • 存数据
  • 取数据

2、两数相加

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

我的代码

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

class Solution:
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        pro = 0
        res = ListNode(0)
        temp = res
        while l1 is not None or l2 is not None :
            d1 ,d2 = 0,0
            if l1 is not None :
                d1 = l1.val
                l1 = l1.next
            if l2 is not None:
                d2 = l2.val
                l2 = l2.next
            d = d1+d2+pro
            pro = d//10
            if d>= 10:
                temp.val = d-10
            else:
                temp.val = d
            if l1 is not None or l2 is not None:
                temp.next = ListNode(0)
                temp = temp.next 
        if pro > 0 :
            temp.next = ListNode(pro)
        return res

知识点

结构体

3、无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。

我的代码

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        now = 0
        temp = ""
        last = 0
        maxStr = ""
        for c in s:
            if c in temp:
                last = last + temp.index(c) + 1
            temp = s[last:now+1]
            if len(temp) > len(maxStr) :
                maxStr = temp
            now = now+1
        return len(maxStr)

知识点

字符串

4、两个排序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3]
nums2 = 2
中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5

我的代码(未通过 )

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        length = len(nums1) + len(nums2)
        start = 1
        end = length
        i,j,k,t = 0,len(nums1)-1,0,len(nums2)-1
        if len(nums1) == 0 or len(nums2) == 0 or nums1 == nums2:
            if len(nums1) != 0 and len(nums2) == 0:
                temp = nums1
            elif len(nums2) != 0 and len(nums1) == 0:
                temp = nums2
            else:
                temp = nums1
            length = len(temp)
            if length == 1:
                return temp[0]
            if length % 2 == 0:
                return (temp[length//2 - 1] + temp[length//2])/2
            else:
                return temp[length//2]
        else:
            while True:
                if (length % 2 == 0 and start + 1 == end) or (length % 2 == 1 and start == end):
                    middle =  nums1[i] + nums1[j] +nums2[k] + nums2[t]
                    return middle/4
                if (nums1[j] >= nums2[t] and j > 0):
                    j = j-1
                    end = end-1
                if (nums1[j] < nums2[t] and t > 0):
                    t = t-1
                    end = end-1
                if (nums1[i] >= nums2[k] and k < len(nums2)-1 ):
                    k = k+1
                    start = start+1
                if (nums1[i] < nums2[k] and i < len(nums1)-1 ):
                    i = i+1
                    start = start+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值