力扣题31~40

news2024/10/17 13:33:24

题31(中等):

分析:

其实这题题目比较难懂,题目还是挺简单的

我们可以从后面末尾开始,如果前一个大于后面的,说明后面不用动,如果小于,那就找仅仅大于它的数字放前面,其他数字重新排序放后面,前面不用动

python代码:

class Solution:

    def nextPermutation(self, nums: List[int]) -> None:

        res_list = []

        # 获取长度

        nums_len = len(nums)

        if nums_len==0 or nums_len==1:

            return

        # 从后面算要不要换

        for i in range(nums_len - 1):

            a = nums[nums_len - i - 1]  # 去已经确定的头

            b = nums[nums_len - i - 2]  # 取新加的

            if a > b:

                res_list = nums[nums_len - i - 2:]

                res_list = sorted(res_list)

                index = res_list.index(b)

                while 1:

                    index += 1

                    if res_list[index] != b:

                        break

                res_list = nums[:nums_len - i - 2] + res_list[index:index + 1] + res_list[0:index] + res_list[index + 1:]

                break

            else:

                if i==nums_len-2:

                    res_list = sorted(nums)

                continue

        nums.clear()

        nums.extend(res_list)

题32(困难):

分析:

其实就是遍历一遍,我的思路就是每一项为前两项的和+2,且将前两项去了

python代码:

class Solution:

    def longestValidParentheses(self, s: str) -> int:

        tmp_list=[]

        s_stack=[]

        for i in s:

            if i=="(":

                s_stack.append(i)

                tmp_list.append(0)

            else:

                if len(s_stack)!=0 and s_stack[-1]=='(':

                    s_stack.pop()

                    if tmp_list!=[]:

                        a1=tmp_list.pop()

                    else:

                        a1=0

                    if tmp_list!=[]:

                        a2=tmp_list.pop()

                    else:

                        a2=0

                    next=a1+a2+2

                    tmp_list.append(next)

                else:

                    tmp_list.append(0)

        return max(tmp_list) if  tmp_list!= [] else 0

题33(中等):

分析:

这个和折半查找应该差不多吧

python代码:

class Solution:

    def search(self, nums: List[int], target: int) -> int:

        if nums[0]<nums[-1]:

            nums=nums[:]+[nums[0]-abs(target)]

        num_len=len(nums)

        left = 0

        right = num_len - 1

        notice1=target>=nums[0]

        notice2=target<=nums[-1]

        if notice1==0 and notice2==0:

            return -1

        while left<=right:

            mid=(left+right)//2

            if notice1:

                if nums[mid]==target:

                    return mid

                elif nums[mid]<=nums[-1] or nums[mid]>target:

                    right=mid-1

                else:

                    left=mid+1

                continue

            if notice2:

                if nums[mid]==target:

                    return mid

                elif nums[mid]>=nums[0] or nums[mid]<target:

                    left=mid+1

                else:

                    right=mid-1

                continue

        return -1

题34(中等):

分析:

没什么好分析的,这波也是折半查找

python代码:

class Solution:

    def searchRange(self, nums: List[int], target: int) -> List[int]:

        left=0

        right=len(nums)-1

        min_target=-1

        while left<=right:

            mid=(left+right)//2

            if nums[mid]==target:

                if mid-1>=0 and nums[mid-1]==target:

                    right=mid-1

                else:

                    min_target=mid

                    break

            elif nums[mid]<target:

                left=mid+1

            elif nums[mid]>target:

                right=mid-1


 

        max_target = -1

        left = 0

        right = len(nums) - 1

        while left<=right:

            mid=(left+right)//2

            if nums[mid]==target:

                if mid + 1 <= len(nums)-1 and nums[mid + 1] == target:

                    left = mid+1

                else:

                    max_target = mid

                    break

            elif nums[mid]<target:

                left=mid+1

            elif nums[mid]>target:

                right=mid-1

        return [min_target,max_target]

题35(简单):

python代码:

class Solution:

    def searchInsert(self, nums: List[int], target: int) -> int:

        left=0

        right=len(nums)-1

        min_target=-1

        while left<=right:

            mid=(left+right)//2

            if nums[mid]==target:

                min_target=mid

                break

            elif nums[mid]<target:

                left=mid+1

            elif nums[mid]>target:

                right=mid-1

        return min_target if min_target!=-1 else right+1

题36(中等):

分析:

自己定义一个检查列表的函数,每次将一堆传过去检测

python代码:

class Solution:

    def isValidSudoku(self, board: List[List[str]]) -> bool:

        def isValidUnit(unit):

            # 检查一个行、列或宫格是否有效

            seen = set()

            for num in unit:

                if num != '.':

                    if num in seen:

                        return False

                    seen.add(num)

            return True

        for i in range(9):

            if not isValidUnit(board[i]):

                return False

        for j in range(9):

            column = [board[i][j] for i in range(9)]

            if not isValidUnit(column):

                return False

        for i in range(0, 9, 3):

            for j in range(0, 9, 3):

                square = [board[x][y] for x in range(i, i+3) for y in range(j, j+3)]

                if not isValidUnit(square):

                    return False

        return True

题37(困难):

python代码:

class Solution:

    def solveSudoku(self, board: List[List[str]]) -> None:

        def Conflict(board):

            def isValidUnit(unit):

                # 检查一个行、列或宫格是否有效

                seen = set()

                for num in unit:

                    if num != '.':

                        if num in seen:

                            return False

                        seen.add(num)

                return True

            for i in range(9):

                if not isValidUnit(board[i]):

                    return False

            for j in range(9):

                column = [board[i][j] for i in range(9)]

                if not isValidUnit(column):

                    return False

            for i in range(0, 9, 3):

                for j in range(0, 9, 3):

                    square = [board[x][y] for x in range(i, i + 3) for y in range(j, j + 3)]

                    if not isValidUnit(square):

                        return False

            return True



 

        def run(n):

            for i in range(n,81):

                x = i // 9

                y = i % 9

                if board[x][y]!='.':

                    continue

                for j in range(1,10):

                    board[x][y]=str(j)

                    if Conflict(board) and run(i+1):

                        return True

                    board[x][y]='.'

                return False

            return True


 

        run(0)

题38(中等):

分析:

用上一个的值生成下一个,用递归最好,其实迭代也挺简单,用数组来接受每一次生成的数据即可

python代码:

class Solution:

    @staticmethod

    def toString(str1):

        t_list = []

        res = ''

        for i in range(len(str1)):

            if t_list!=[] and t_list[0]!=str1[i]:

                res=res+str(len(t_list))+t_list[0]

                t_list=[]

            t_list.append(str1[i])

        res=res+str(len(t_list))+t_list[0]

        return res

       

    def countAndSay(self, n: int) -> str:

        if n==1:

            return '1'

        else:

            newstr=self.countAndSay(n-1)

            print(newstr)

            return Solution.toString(newstr)

题39(中等):

分析:

以后写代码先写注释再写代码,思路更清晰,分析再代码中

python代码:

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        #这个组合题思路肯定是递归,非线性的嘛
        #先排好序
        s_can=sorted(candidates)

        self.res=[]
        self.call_back(candidates,target,[],0)
        return self.res


        pass

    def call_back(self,candidates,target,n_list,k):
        #对m操作,这样回溯更稳, 注意深拷贝和浅拷贝
        m=n_list.copy()
        #如果target==0,说明已经找到了一组解,将m加入res
        if target==0:
            self.res.append(m)
            return

        #如果target<0,说明已经超了,直接返回
        if target<0:
            return

        #如果target>0,说明还有剩余,继续递归,借助k来看现在当前最小的是哪个数字,n_list是已经找到的数字
        if target>0:
            for i in range(k,len(candidates)):
                self.call_back(candidates,target-candidates[len(candidates)-i-1],n_list+[candidates[len(candidates)-i-1]],i)

看起来好像代码背景比块背景好看唉

题40(中等):

分析:

见代码注释区域

python代码:

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        #不重复思路肯定也是递归
        s_can=sorted(candidates)
        self.res=[]
        self.call_back(s_can,target,[])
        return self.res


    def call_back(self,s_can,target,res_list):
        #如果值等于0,则加入res
        if target==0:
            self.res.append(res_list)
            return

        #如果值小于0或者数组为空,则退出
        if target<0 or len(s_can)==0:
            return

        #如果值大于0,则递归,注意,我们是从高位开始,所以我们是要找小的,不能找大的
        for i in range(len(s_can)):
            #如果该项和上一项相同,则跳过
            if i>0 and s_can[len(s_can)-i-1]==s_can[len(s_can)-i]:
                continue
            k=s_can[len(s_can)-1-i]
            new_target=target-k
            new_list=res_list.copy()
            new_list.append(k)
            new_scan=s_can[0:len(s_can)-1-i]
            self.call_back(new_scan,new_target,new_list)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个将.Geojson文件转成shapefile和kml文件的在线页面工具

最近需要读取.geojson格式的流域边界文件。在谷歌地球桌面版和globalMapper中均无法正常读取。下面我发现的一个在线的平台可以很好实现这一功能。 GeoJSON to SHP Converter Online - MyGeodata Cloud ❤️欢迎点赞收藏❤️

2000.1-2024.7中国经济政策不确定性指数(月度)

2000.1-2024.7中国经济政策不确定性指数&#xff08;月度&#xff09; 1、时间&#xff1a;2000.1-2024.7 2、指标&#xff1a;Date、CNEPU 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、说明&#xff1a;中国经济政策不确定性指数&#xff0c;用于衡量…

MongoDB安装保姆级教程

安装MongoDB 1.下载地址 https://www.mongodb.com/try/download/community 这里选择的5版本的。 2.选择zip下载 (也可以选择msi一步步安装) 3.配置环境变量 将MongoDB的bin目录添加到path下 E:\JavaPackage\mongodb\bin 4.检查是否配置成功 cmd里执行 mongod WINR&…

JavaSE——集合12:Map接口实现类—Properties

目录 一、Properties基本介绍 二、Properties常用方法 一、Properties基本介绍 Properties类继承自HashTable类并且实现了Map接口&#xff0c;也是使用一种键值对的形式&#xff0c;来保存数据。Properties的使用特点和HashTable类似Properties还可以用于从xxx.properties文件…

“我们为什么缺少科学精神”演讲内容拆解

演讲人张双南&#xff0c;视频链接&#xff1a; https://tv.cctv.com/2017/04/23/VIDEdqzdpmxStYXAmYBdgDP7170423.shtml

【数据结构】:破译排序算法--数字世界的秩序密码(二)

文章目录 前言一.比较排序算法1.Bubble Sort冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性 2.Quick Sort快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现 2.2.非递归快速排序2.2.1.非递归快速排序原理2.2.2.非…

多线程的状态及切换流程

多线程的状态及切换流程 线程状态说明&#xff1a; 初始化&#xff08;Init&#xff09;&#xff1a;该线程正在被创建。就绪&#xff08;Ready&#xff09;&#xff1a;该线程在就绪列表中&#xff0c;等待 CPU 调度。运行&#xff08;Running&#xff09;&#xff1a;该线程…

Arduino R3笔记24 之 Arduino如何使用MAX7219控制多个数码管?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:前面学习了单个数码管的控制,但是在大多场合一个数码管是满足不了使用场景的,因此对于数码管的学习,应该学会用尽可能少的端口去驱动更多的数码管,在此情况下,MAX7219比较适合我们使用。 1.M…

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)3.5-3.6

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第三周 目标检测&#xff08;Object detection&#xff09;3.5 Bounding Box 预测&#xff08;Bounding box predictions&#xff09;3.6 交并比&#xff08;Intersection over union&#xf…

leetcode36:有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

详解腐烂的苹果(图+代码+广度优先遍历)

描述 给定一个 nm nm 的网格&#xff0c;其中每个单元格中可能有三种值中的一个 0 , 1 , 2。其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果&#xff0c;2 表示这个格子有一个腐烂的苹果。腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌&#xff0c;并导…

Elsevier旗下老牌TOP上榜On Hold名单!原因涉及“论文工厂”?

【SciencePub学术】上个月突发“On Hold”近10本期刊&#xff0c;看来科睿唯安又是闷声干大事。大家注意&#xff0c;On Hold期间&#xff0c;提交的论文是不能被检索到的&#xff0c;甚至此类期刊有可能随时被WOS目录剔除&#xff0c;所以请大家注意甄别&#xff0c;谨慎投递&…

快速理解http的get和post

在网络通信中&#xff0c;HTTP 协议扮演着非常重要的角色&#xff0c;而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…

Linux系统:sudo systemctl reload apache2命令作用

sudo systemctl reload apache2命令作用 sudo systemctl reload apache2 是一个用于重新加载 Apache Web服务器的命令。这个命令并不会停止然后重新启动服务&#xff0c;而是尝试重新加载配置文件&#xff0c;并对正在运行的服务进行无中断的重新加载。这通常用于在更改了Apach…

Karmada核心概念

以下内容为翻译&#xff0c;原文地址 Karmada 是什么&#xff1f; | karmada 一、Karmada核心概念 一&#xff09;什么是Karmada 1、Karmada&#xff1a;开放&#xff0c;多云&#xff0c;多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…

省出一套黑神话,光威神武DDR5 6800 C32 32GB内存条:游戏玩家的高性能选择

在游戏的世界里&#xff0c;每一帧的流畅度都可能决定胜负&#xff0c;尤其是那些对硬件规格要求较高的游戏来说&#xff0c;PC上每一种硬件的性能表现都至关重要。对于追求极致游戏体验的玩家来说&#xff0c;一款高性能的内存条是不可或缺的。前些年很多人可能还比较关注国际…

Linux下内核空间和用户空间内存映射图详解

目录 一、简介二、内存空间定义三、内存权限四、内存空间映射图4.1 32位系统4.2 64位系统4.3 映射空间解析 五、其他相关链接1、关于linux下内存管理内容总结2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解3、Linux下stream内存带宽测试参数和示例详解附源码总结 一、…

K8s的储存

一 configmap 1.1 configmap的功能 configMap用于保存配置数据&#xff0c;以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用场…

【C++】———— 日期类练习

目录 前言 时间类定义 成员函数具体实现 1.获取某年某月天数 2.构造函数 3.析构函数 4.拷贝构造 5.日期类的运算符重载 5.1赋值运算符重载 5.2 和 - - 的前置后置 5.3日期比较(> , < , > ,< , ,!) 5.4 、 、- 、- 5.5日期减日期&#xff0c;求差值…