1,2--LeetCode-python笔记

一.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

(1)暴力算法,时间复杂度O(n2)
class Solution(object):
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return[i,j]
 

  
(2)哈希表,O(n)
class Solution(object):
    def twoSum(self, nums, target):
        n={}
        for i,v in enumerate(nums):
            if v in n:                                   
                return[n[v],i]
            else:
                n[target-v]=i                      
#把target-v当成值存入字典n,值为v的地址                                                          

#在后面遍历中n若有target-v,把字典中的值即前面的地址,和当前地址输出

二.

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

(1)class Solution:
    def addTwoNumbers(self, l1, l2):
        # 这里一开始不做l1、l2非空判断,题意表明非空链表
       
        carry = 0  #存储l1+l2+之前的进位
        # res = pre = ListNode(0),这里是创建头结点
        res = ListNode(0)
        pre = res
        # 判断l1、l2、carry是否有值,carry有值的话需要增加新节点
        while l1 or l2 or carry:
            # 判断l1是否有值
            if l1:
                carry += l1.val     #将l1加入c位
                l1 = l1.next
            # 判断l2是否有值
            if l2:
                carry += l2.val    #将l2加入c位
                l2 = l2.next
            # carry有同级节点的和之前的进位
            # divmod返回商与余数的元组,拆包为carry和val
           #商为进位,更新给carry,让其与下个结点l1和l2相加
            carry, val = divmod(carry, 10)
            # 新建链表节点
            # 这里是n.next = ListNode(val), n = n.next()
            pre.next=ListNode(val)     #次位的答案就是进位后的剩余,创造结点后放入
            pre=pre.next
        return res.next

猜你喜欢

转载自blog.csdn.net/chenlufei_i/article/details/87967925