首页 > 其他分享 >datawhale-leetcode打卡:001-012题

datawhale-leetcode打卡:001-012题

时间:2024-01-18 22:59:34浏览次数:25  
标签:return matrix nums int List 001 012 打卡 leetcode

这次这十二个题目属于是极限肝出来的,有两个参考了一下题解,还是很有意思。我会按照我个人的感觉去写这个东西。

螺旋矩阵(leetcode 054)

这个题目比较恶心的就是跑圈的过程怎么描述。首先,顺时针一圈下来是先从左到右,顶到最右边i<m,好再往下,顶到最下边i<n,好现在i--往回排,最后j--走完一圈以后圈数+1进入下一圈。我本来打算用一个变量记录圈数但是有点不好实现,然后参考了一下题解,发现别人的解法其实也比较简单就是记录左右上下四个边界就可以了。边界越界的话就判定做完了。这个题参考了一下题解,有点小难度,我把代码放过来:

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
        while True:
            for i in range(l, r + 1): 
                res.append(matrix[t][i]) # left to right
            t += 1
            if t > b: 
                break
            for i in range(t, b + 1): 
                res.append(matrix[i][r]) # top to bottom
            r -= 1
            if l > r: 
                break
            for i in range(r, l - 1, -1): 
                res.append(matrix[b][i]) # right to left
            b -= 1
            if t > b: 
                break
            for i in range(b, t - 1, -1): 
                res.append(matrix[i][l]) # bottom to top
            l += 1
            if l > r: 
                break
        return res

旋转图像(leetcode 0048)

这个题目我以前做过,其实道理很简单。首先将矩阵倒排,然后求转置就可以了。转置本质上是一个交换元素的过程,所以可以常量空间。倒排的话,有现成的方法可以排序。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        matrix.reverse()
        n=len(matrix)
        
        for i in range(n):
            for j in range(i,n):
                t=matrix[j][i]
                matrix[j][i]=matrix[i][j]
                matrix[i][j]=t
        
        return matrix

数组中第K个最大的元素(leetcode 215)

这个题本质上就是一个排序,然后索引就好了。属于送分题。

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        return sorted(nums)[::-1][k-1]

排序数组(leetcode 912)

还是数组排序,基本属于送分。

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        return sorted(nums)

合并两个有序数组(leetcode 088)

这个题目不要看它还是在排序,这个题目有点阴险的。阴险之处在于它没有返回值,直接修改参数num1。C语言里面有指针,C++有引用,但是python传的参数通常不太能直接修改。但是对于数组没必要上深拷贝,使用[:]就可以改动实参值了,这是一个小技巧,也是为什么跑了好几次都没跑过的地方。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[:]=sorted(nums1[0:m]+nums2[0:n])

多数元素(leetcode 169)

这个题本质考的就是一个数组计数,类似于wordcount。用字典就可以实现,遍历数据然后创建键值对挨个+1就行。最后通过items遍历找最大的那个就行。当然这个题目还有另外一种解法,但是我这里有一个明确的想法就按这个想法来做。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        count={}
        N=len(nums)
        for n in nums:
            if n not in count.keys():
                count[n]=1
            else:
                count[n]+=1
        for c in count.items():
            if c[1]>int(N/2):
                return c[0]

只出现一次的数字(leetcode 136)

这个题其实原理和上一题一样,可以用字典计数的方法做,但是这个题字典计数就慢了。首先可以对数组进行排序,如果只出现一次,那么它和前后两者都不一样。什么?它没有前?那就是首元素了。没有后?那就是末元素了。分类讨论就行。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums.sort()
        res=None
        for i in range(len(nums)):
            if i==0:
                if nums.count(nums[i])==1:
                    return nums[i]
            elif i==len(nums)-1:
                if nums.count(nums[i])==1:
                    return nums[i]
            else:
                if nums[i]!=nums[i-1] and nums[i]!=nums[i+1]:
                    return nums[i]

合并区间(leetcode 56)

这个题其实参考了一下题解,因为最开始想用栈写结果各种bug。其实这个题目用贪心就可以,每次都把元素追加到结果的末尾。如果待追加元素的左极限刚好在结果最末尾的区间之内,那么这两个元素是可以合并的,否则就添加进来就可以。

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort()
        ans = [intervals[0]]
        for s, e in intervals[1:]:
            if ans[-1][1] < s:
                ans.append([s, e])
            else:
                ans[-1][1] = max(ans[-1][1], e)
        return ans

最大数(leetcode 179)

这道题最开始我本来想通过字符串排序获得答案,还想这个题是不是太容易了。但是事实比我想的复杂,这个方法得不到正确结果。例如,30和3拼出来的最大数应该是330而非303,所以不仅要按字符串排还需要按位数来看。但是分组按位数来排序好像也不对,我就不知道怎么弄了。最后看了一下题解,这道题其实也是贪心的一种。

本题的贪心策略的正确性证明包括以下两个命题:

  • 反身性:对于任意的数字x,有 xx=xx。
  • 传递性:假设对于任意的数字x y z,如果 xy<yx, yz<zy ,那么 xz<zx 一定成立。

反身性这个显然。那么传递性呢?其实是可以证明的。

代码如下

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        def rule(x,y):
            a,b=x+y,y+x
            if a<b:
                return 1
            elif a>b:
                return -1
            else:
                return 0
        new=[str(i) for i in nums]
        new.sort(key=cmp_to_key(rule))
        # return ''.join(new[::-1])
        return ''.join(new)

二分查找(leetcode 704)

这个题也比较简单,基本送分,用index函数就可以。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        try:
            return nums.index(target)
        except:
            return -1

第一个和最后一个位置(leetcode 34)

这个题仍然用index。但是有一个问题,index返回第一次出现这个元素的位置,那么最后一次出现的位置就需要进行倒排。倒排最后一次出现的位置,进行镜像对称就可以得到最后一次出现的位置了。比如说,倒排最后出现的下标是i,那么镜像一下就变为n-1-i。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        try:
            i1=nums.index(target)
            
            i2=len(nums)-1-nums[::-1].index(target)
            return [i1,i2]
        except:
            return [-1,-1]

旋转排序数组的最小值(leetcode 153)

这个题说所谓旋转,其实就是循环右移。它是由两个递增序列拼接而成,你的目的就是找到二者的分界点是哪一个。那其实找分界点就是:比左边大,比右边更大的节点。你可以使用二分查找的方式,也可以使用遍历查找的方式。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        for i in range(1,len(nums)-1):
            if nums[i]>nums[i-1] and nums[i]>nums[i+1]:
                return nums[i+1]
        return min(nums[0],nums[-1])

(这个题目还有一个偷巧的方法,min(nums)一步到位哈哈哈,但是太猥琐了我就算了)

标签:return,matrix,nums,int,List,001,012,打卡,leetcode
From: https://www.cnblogs.com/Mast1031/p/17973589

相关文章

  • P9012 [USACO23JAN] Moo Operations B题解
    第1道赛场AC的题,必须发篇题解记录一下。Tips:\(1\le|S|\le100\)——题目才100,这就可以随便整活了。如果你稍微懂点英语,就会知道第\(2\sim4\)个点的\(S\)都最多只有\(3\)个字符,而目标“MOO”也是\(3\)个字符,所以只需要模拟就可以了。intcheck(string......
  • 大二打卡(12.23)
    uml作业:实现视图建模:(2)、绘制顺序图充值消费子系统:  身份识别门禁子系统: 校方卡片授权信息管理子系统:(3)、绘制协作图充值消费子系统: 身份识别门禁子系统: 校方卡片授权信息管理子系统: (4)、绘制活动图充值消费子系统: 身份识别门禁子系统: 校方卡片授权信息......
  • 大二打卡(12.18)
    今天做了什么:在期末考试的那一天,早早地来到了考场,准备迎接这场挑战。考试铃声响起,老师开始逐一发放试卷。深吸一口气,开始认真地审题。说实话,经过这么长时间的练习,已经对这类题目驾轻就熟了。建立表、编写页面、编写Java文件,这些步骤几乎成了肌肉记忆,几乎不需要思考就能完成。考......
  • 大二打卡(12.19)
    uml作业:逻辑视图建模:(1)分析系统用例,确定对象类:“校园卡管理系统”包括“身份识别门禁系统”“充值消费系统”和“校方卡片授权信息管理系统”等。[系统业务需求描述]:身份识别门禁系统:完成人员的身份识别和认证、门禁控制、门锁控制、通道控制、考勤管理、会议签到等业务。......
  • 大二打卡(12.20)
    uml作业:逻辑视图建模:[系统边界类与系统控制类]系统边界类主要是指系统与用户交互界面有关的类。身份识别门禁子系统中涉及与用户交互的界面类有3个:(1)待机界面类:在镜头前没有人脸需要识别时,待机暂停图像信息的录入与识别。(2)人脸面部信息录入窗口类:开启摄像头的信息录入功能......
  • 大二打卡(12.21)
    uml作业:实现视图建模:(1)分析系统用例流程中对象间的交互“校园卡管理系统”包括“充值消费子系统”、“身份识别门禁子系统”、“校方卡片授权信息管理子系统”等。[用例流程描述]充值消费子系统:用户通过界面输入个人信息和充值金额,提交充值申请。系统验证用户身份和账户信息......
  • 20240116打卡
    今天对servlet规范进行了学习,主要参考了实现Servlet服务器-廖雪峰的官方网站(liaoxuefeng.com),有了一个相对全面的认识,自己之前学的代码还是很不规范的,虽然能跑,但实际上没有条理框架,不方便自己和他人阅读和修改。与此同时,我对项目的搭建流程进行了一次思维上的梳理,尝试理清更......
  • flask-study-001
    本篇博客主要记录python3.6使用flask开发代码托管:https://gitee.com/liwl1991/my-flask1.pip3配置国内源终端执行:pip3configsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple查看:pip3configlist2.安装flask环境终端执行:pip3installflask3.创建app.......
  • flask学习001
    1.pip3配置国内源(阿里云)pip3configsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple查看:pip3configlist2.安装flask环境pip3installflask3.创建app.pyfromflaskimportFlaskapp=Flask(__name__)@app.route('/')defindex():return"......
  • P9871 [NOIP2023] 天天爱打卡
    [NOIP2023]天天爱打卡题目描述小T同学非常热衷于跑步。为了让跑步更加有趣,他决定制作一款叫做《天天爱打卡》的软件,使得用户每天都可以进行跑步打卡。开发完成后,小T同学计划进行试运行,他找了大Y同学来帮忙。试运行共\(n\)天,编号为从\(1\)到\(n\)。对大Y同学来说......