LeetCode详解python版
打算把LeetCode上⾯的题都实现⼀遍,每⽇两题
LeetCode⽬录
1.两数之和
给定⼀个整数数组 nums 和⼀个整数⽬标值 target,请你在该数组中出和为⽬标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输⼊只会对应⼀个答案。但是,数组中同⼀个元素在答案⾥不能重复出现。
你可以按任意顺序返回答案
⽰例
输⼊:nums =[2,7,11,15], target =9
输出:[0,1]
解释:因为 nums[0]+ nums[1]==9,返回[0,1]。
输⼊:nums =[3,2,4], target =6
输出:[1,2]
输⼊:nums =[3,3], target =6
输出:[0,1]
思路
代码
class Solution:
def twoSum(self, nums: List[int], target:int)-> List[int]:
dist={}
for d,ind in enumerate(nums):
dist[ind]= d
for i, j in enumerate(nums):
f = (target - j)
if f is not None and f != i:
return[i, f]
2. 两数相加
给你两个 ⾮空 的链表,表⽰两个⾮负的整数。它们每位数字都是按照 逆序 的⽅式存储的,并且每个节点只能存储 ⼀位 数字。请你将两个数相加,并以相同形式返回⼀个表⽰和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode)-> ListNode:
re = ListNode(0)
r=re
carry=0
while(l1 or l2):
x= l1.val if l1 else0
y= l2.val if l2 else0
s=carry+x+y
carry=s//10
<=ListNode(s%10)
if(l1!=None):
if(l2!=None):
if(carry>0):
python获取数组长度<=ListNode(1)
35.搜索插⼊位置
给定⼀个排序数组和⼀个⽬标值,在数组中到⽬标值,并返回其索引。如果⽬标值不存在于数组中,返回它将会被按顺序插⼊的位置。请必须使⽤时间复杂度为 O(log n) 的算法。
⽰例1:
输⼊: nums =[1,3,5,6], target =5
输出:2
⽰例2:
输⼊: nums =[1,3,5,6], target =2
输出:1
⽰例3:
输⼊: nums =[1,3,5,6], target =7
输出:4
⽰例4:
输⼊: nums =[1,3,5,6], target =0
输出:0
⽰例5:
输⼊: nums =[1], target =0
输出:0
思路
代码
class Solution:
def searchInsert(self, nums: List[int], target:int)->int:
left =0
right =len(nums)-1
while(left <= right):
mid =int(left +(right - left )/2)
if nums[mid]< target:
left = mid +1
else:
right = mid -1
return left
64. 最⼩路径和
给定⼀个包含⾮负整数的 m x n ⽹格 grid ,请出⼀条从左上⾓到右下⾓的路径,使得路径上的数字总和为最⼩。说明:每次只能向下或者向右移动⼀步。
思路
代码
class Solution:
def minPathSum(self, grid: List[List[int]])->int:
m =len(grid)
n =len(grid[0])
if(m<=0or n<=0):
return0
dp =[]
for i in range(m):
dp.append([])
for j in range(n):
dp[i].append(0)
dp[0][0]= grid[0][0]
for i in range(1,m):
dp[i][0]= grid[i][0]+ dp[i-1][0]
for i in range(1,n):
dp[0][i]= grid[0][i]+ dp[0][i-1]
for i in range(1,m):
for j in range(1,n):
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+ grid[i][j]
return dp[m-1][n-1]
70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的⽅法可以爬到楼顶呢?
注意:给定 n 是⼀个正整数。
⽰例1:
输⼊:2
输出:2
解释:有两种⽅法可以爬到楼顶。
1.1阶+1阶
2.2阶
⽰例2:
输⼊:3
输出:3
解释:有三种⽅法可以爬到楼顶。
1.1阶+1阶+1阶
2.1阶+2阶
3.2阶+1阶
思路
代码
class Solution:
def climbStairs(self, n:int)->int:
A =[]
if(n<=2):
return n
A.append(0)
A.append(1)
A.append(2)
for i in range(3,n+1):
A.append(A[i-1]+ A[i-2])
return int(A[i])
167. 两数之和 II - 输⼊有序数组
给定⼀个已按照 ⾮递减顺序排列 的整数数组 numbers ,请你从数组中出两个数满⾜相加之和等于⽬标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满⾜ 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输⼊ 只对应唯⼀的答案 ,⽽且你 不可以 重复使⽤相同的元素。
⽰例1:
输⼊:numbers =[2,7,11,15], target =9
输出:[1,2]
解释:2与7之和等于⽬标数9。因此 index1 =1, index2 =2。
⽰例2:
输⼊:numbers =[2,3,4], target =6
输出:[1,3]
⽰例3:
输⼊:numbers =[-1,0], target =-1
输出:[1,2]
思路
代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论