200道大数据面试常考Leetcode算法题--数组篇02(python带代码解析)

往期内容在这里:

往期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)再见!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小海龟

谢谢你的打赏,微臣会好好努力达

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值