往期内容在这里:
往期01-05
往期06-10
往期11-15
往期16-20
数组篇01
大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--数组篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)每篇更新5篇,一共更新数组篇20篇,艾瑞巴迪和我一起刷起来!!
200道大数据面试常考Leetcode算法题(数组篇)35- 搜索插入位置
Leetcode原题:
题解为 :
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if not nums:
return nums
# 定义左节点
left = 0
# 定义右节点
right = len(nums) - 1
# 从左开始向右循环
while(left <= right):
# 找到重中点
mid = (left + right) // 2
# 假如中点为目标数
if(nums[mid] == target):
return mid
# 目标数是否在右边
if(nums[mid] < target):
# 则左节点从中点右边开始
left = mid+1
# 目标数在左边
else:
# 则右节点从中点左边开始
right = mid -1
# 跳出循环时,left 指向 target 插入位置,返回 left
return left
200道大数据面试常考Leetcode算法题(数组篇)39-组合总和Ⅰ
Leetcode原题:
题解为:
def combinationSum(self, nums: List[int], target: int) -> List[List[int]]:
ans=[]
for i in range(len(nums)):
# 若target-nums[i]<0,则以nums[i]为首元素无符合的组合
if target-nums[i]<0:
continue
elif target-nums[i]==0:
# 若target-nums[i]=0,则[nums[i]]即为唯一符合的组合
ans.append([nums[i]])
# 若target-nums[i]>0,则递归调用函数(以target-nums[i]为目标,nums[i:]为可用数组)
else:
ans+=[[nums[i]]+rest for rest in self.combinationSum(nums[i:],target-nums[i])]
return ans
200道大数据面试常考Leetcode算法题(数组篇)40-组合总和Ⅱ
Leetcode原题:
?题解为:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
# 特判,若candidatescandidates为空,则返回[]
if(not candidates):
return []
# 数组长度循环次数
n=len(candidates)
# 排序
candidates.sort()
res=[]
# 回溯函数helper()helper(),
# 传入参数:下一加和索引ii,当前已加和数组tmptmp,下一目标targettarget
def helper(i,tmp,target):
# 若target==0target==0,说明当前和满足条件,
# 将当前加和数组tmptmp加入resres,并return。
print(i,tmp,target)
if(target==0):
res.append(tmp)
return
# 若target==0target==0,
# 说明当前和满足条件,将当前加和数组tmptmp加入resres,并return。
if(i==n or target<candidates[i]):
return
# 对于j遍历区间[i,n)(为了防止数组越界,首先保证j>i,判断是否和上一元素相等),分为以下两种情况:
for j in range(i,n):
# 若满足条件j>i and candidates[j] == candidates[j-1]j>iandcandidates[j]==candidates[j?1],则跳过,避免出现重复解,同时也进行了剪枝。
if(j>i and candidates[j]==candidates[j-1]):
continue
# 否则,执行helper(j+1,tmp+[candidates[j]],target-candidates[j])
helper(j+1,tmp+[candidates[j]],target-candidates[j])
# 执行helper(0,[],target)helper(0,[],target),并返回resres
helper(0,[],target)
return res
200道大数据面试常考Leetcode算法题(数组篇)48-旋转图形
Leetcode原题为:
题解为:
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 初始数组的长度
n = len(matrix)
# 双层循环类似二维数组,先转置,对角线不变,行列相反
for i in range(n):
for j in range(i+1,n):
matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]
# 然后再关于中点对称即可
mid = n//2
for j in range(mid):
for i in range(n):
matrix[i][j],matrix[i][n-j-1] = matrix[i][n-j-1,matrix[i][j]
200道大数据面试常考Leetcode算法题(数组篇)54-螺旋矩阵
Leetcode原题为:
题解为:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 特殊判断
if not matrix : return []
res = []
# 对数组循环3次
while matrix:
# 直接取出取出第一行
res.extend(matrix.pop(0))
# 下一个矩阵
next_matrix = []
# 对剩下的两行就是转置
for x in zip(*matrix):
# 添加到下一矩阵,即下一矩阵为竖着的矩阵
next_matrix.append(x)
# 重新赋值矩阵,不断取出第一行
matrix = next_matrix[::-1]
return res
好啦,这期的分享到这里结束啦!我们下期(数组篇03)再见!
|