每日1题 -有序矩阵中的第 k 个最小数组和


Python代码如下↓

class Solution:
    def kthSmallest(self, mat: List[List[int]], k: int) -> int:
        # mat:m*n
        m=len(mat)
        n=len(mat[0])

        # 初始化Best_pointer
        Best_pointer=[0]*m

        if k==1:
            return self.Calculate(mat,Best_pointer)

        Candidate_pointers=[]
        Hash={}

        for _ in range(1,k):

            # 根据Best_pointer,向Candidate_pointers中加入New_pointer
            for i in range(m):
                if Best_pointer[i]<n-1:
                    New_pointer=Best_pointer.copy()
                    New_pointer[i]+=1

                    # 利用散列表判断有无重复
                    if tuple(New_pointer) in Hash:
                        continue
                    else:
                        Hash[tuple(New_pointer)]=1
                        Candidate_pointers.append(New_pointer)

            minimum=+inf
            # 依次遍历Candidate_pointers,选出Best_pointer
            for Candidate_pointer in Candidate_pointers:
                C=self.Calculate(mat,Candidate_pointer)
                if C<minimum:
                    minimum=C
                    Best_pointer=Candidate_pointer

            # 移除Best_pointer
            Candidate_pointers.remove(Best_pointer)

        return minimum

    # 根据pointer计算对应的值
    def Calculate(self,mat,pointer):
        t=0
        for i in range(len(mat)):
            t+=mat[i][pointer[i]]
        return t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值