【数据结构与算法】之数组系列-20240116

在这里插入图片描述


这里写目录标题

  • 一、15. 三数之和
  • 二、16. 最接近的三数之和
  • 三、49. 字母异位词分组
  • 四、53. 最大子数组和
  • 五、189. 轮转数组
  • 六、179. 最大数

一、15. 三数之和

提示
中等
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

class Solution:
    def threeSum(self,nums):
        res=[]
        nums.sort()
        n=len(nums)
        if n<3:
            return []
        for i in range(n):
            if nums[i]>0:
                return res
            L=i+1
            R=n-1
            while L<R:
                if nums[i]+nums[L]+nums[R]==0:
                    res.append([nums[i],nums[L],nums[R]])
                    while L<R and nums[L]==nums[L+1]:
                        L=L+1
                    while L<R and nums[R]==nums[R-1]:
                        R=R-1
                    L=L+1
                    R=R-1
                elif nums[i]+nums[L]+nums[R]>0:
                    R=R-1
                else:
                    L=L+1
        return res

nums = [-1, 0, 1, 2, -1, -4]
res = Solution()
rrr = res.threeSum(nums)
print(rrr)

二、16. 最接近的三数之和

中等

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。

示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:
输入:nums = [0,0,0], target = 1
输出:0

思路:排序+双指针
我们将数组排序,然后遍历数组,对于每个元素nums[i],我们使用指针j和k分别指向i+1和n-1
计算三数之和,如果三数和等于target,则直接返回target,否则根据与target的差值更新答案
如果三数之和大于target,则将R向左移动一位,否则将L向右移动一位。

class Solution:
    def threeSumClosest(self,nums,target):
        ans=inf
        nums.sort()
        n=len(nums)
        if n<3:
            return []

        for i in range(n):
            L=i+1
            R=n-1
            while L<R:
                if nums[i]+nums[L]+nums[R]==target:
                    return target
                t=nums[i]+nums[L]+nums[R]
                if abs(t-target)<abs(ans-target):
                    ans=t
                if t>target:
                    R=R-1
                else:
                    L=L+1
        return ans

s = Solution()
nums = [-1, 2, 1, -4]
target = 1
print(s.threeSumClosest(nums, target))

特别注意:
from math import inf是从math库中导入inf常量。
inf表示正无穷大的数值。它可以用于比较和计算中的特殊情况。
以下是一个示例代码,演示了如何使用inf常量:

from math import inf

# 比较inf常量
print(inf > 100)  # 输出:True
print(inf < 1000)  # 输出:False

# 计算inf常量
print(inf + 10)  # 输出:inf
print(inf * 2)  # 输出:inf
print(inf / 3)  # 输出:inf

在上面的示例中,我们可以看到inf常量与其他数值进行比较时,inf常量始终被认为是最大的数值。
在计算中,任何数值与inf常量相加、相乘或相除,结果都将是inf常量。

三、49. 字母异位词分组

中等
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]

class Solution:
    def func(self,strs):
        d=defaultdict(list)
        for item in strs:
            key=''.join(sorted(item))
            d[key].append(item)
        return list(d.values())

ss=Solution()
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
print(ss.func(strs))

四、53. 最大子数组和

中等
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:
输入:nums = [1]
输出:1

示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

class Solution:
    def lianxu(self, nums):
        pre = 0
        max_sum = nums[0]
        i = 0
        while i < len(nums):
            if pre < 0:
                pre = 0
            pre = pre + nums[i]     # -2     1
            if max_sum < pre:       # -2<0   -2<1
                max_sum = pre       # 0      1
            i += 1                  # 1      2
        return max_sum


nums = [5, 4, -1, 7, 8]

ss = Solution()
print(ss.lianxu(nums))

五、189. 轮转数组

中等
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

思路:
先整体反转数组,即反转[0,n-1]区间
然后分别反转[0,k-1]和[k,n-1]区间即为结果

在这里插入图片描述
具体举例如下:

例如将4-5-6-7-8向右轮转3个位置。即k=3。首先整体翻转
在这里插入图片描述
然后分别翻转[0,k−1]和[k,n−1](先后无所谓)
如下翻转8-7-6
在这里插入图片描述
再翻转5-4,得到最后的结果
在这里插入图片描述

class Solution:
    def retate(self,nums,k):
        k=k%len(nums)       #映射后的下标的位置
        self.reverse(nums,0,len(nums)-1)
        self.reverse(nums,0,k-1)
        self.reverse(nums,k,len(nums)-1)

        return nums

    def reverse(self,nums,start,end):
        while start<end:
            nums[start],nums[end]=nums[end],nums[start]
            start+=1
            end-=1

ss=Solution()
nums = [1,2,3,4,5,6,7]
k = 3
print(ss.retate(nums, k))

六、179. 最大数

中等
相关标签
相关企业
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:“210”
示例 2:

输入:nums = [3,30,34,5,9]
输出:“9534330”

思路:1、先将列表的数字通过map函数映射为字符串,再转化为列表
2、将列表中的字符,通过sorted方法按照降序排序
3、遍历字符串,如果相邻两个字符的首字符相同,判断当前字符的末尾与下一个字符的首位进行比较,如果当前字符的末位小于下一个字符的首位,则进行交换位置

def fn(nums):
    #todo 1先根据首位排序
    s = list(map(str, nums))    #利用map映射函数
    print(s)            #['3', '30', '34', '5', '9']
    ordered = sorted(s, key=lambda x: x, reverse=True)  #通过sorted降序排序
    print(ordered)      #['9', '5', '34', '30', '3']

    #todo 2、首位相同的,进行二次排序

    for i in range(len(ordered) - 1):
        #todo 如果相邻两个字符的首字符相同,
        if ordered[i][0] == ordered[i + 1][0]:
            # todo 判断当前字符的末尾与下一个字符的首位进行比较,
            #todo  如果当前字符的末位小于下一个字符的首位,则进行交换位置
            if int(ordered[i][-1]) < int(ordered[i + 1][0]):
                ordered[i], ordered[i + 1] = ordered[i + 1], ordered[i]
    return ''.join(ordered)
nums = [10,2]
res=fn(nums)
print(res)


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解结算平台:准确高效给商户结款

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;4&#xff09;篇。 本章主要讲清楚支付系统中商户结算涉及的基本概念&#xff0c;产品架构、系统架构&#xff0c;以及一些核心的流程和相关领域模型、状态机设计等。 1. 前言 收单结算是支付系统最重要的子…

Python入门-字面量,函数,类

Python 中常用的有6种值&#xff08;数据&#xff09;的类型 (1)字符串需要用英文的双引号包围起来&#xff0c;比如打印"helloworld" &#xff08;2&#xff09;浮点数&#xff0c;整数&#xff0c;字符串等字面量的写法 &#xff08;3&#xff09;字符串定义及打印…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (二)

论文阅读笔记AI篇 —— Transformer模型理论实战&#xff08;二&#xff09; 第二遍阅读&#xff08;通读&#xff09;2.1 Background2.2 Model Architecture2.2.1 Encoder and Decoder Stacks2.2.2 Scaled Dot-Product Attention2.2.3 Multi-Head Attention 2.3 Why Self-Atte…

【STM32】STM32学习笔记-I2C通信协议(31)

00. 目录 文章目录 00. 目录01. I2C简介02. I2C主要特点03. I2C硬件电路04. I2C时序基本单元05. I2C时序波形图06. 附录 01. I2C简介 I2C(Inter&#xff0d;Integrated Circuit)总线是一种由NXP&#xff08;原PHILIPS&#xff09;公司开发的两线式串行总线&#xff0c;用于连接…

安装SCCM时出现的问题

出现这个问题 根据提示信息逐一排除以下问题&#xff1a; 1、确保SQL服务器名称是否正确。 2、确保TCP1433和4022端口有没有被防火墙屏蔽。 3、站点服务器帐号加入SQLServer的sysadmin角色成员里。 4、确保SQL实例没有使用动态端口&#xff0c;可参考&#xff1a; Config…

#RAG##AIGC#检索增强生成 (RAG) 基本介绍和入门实操示例

本文包括RAG基本介绍和入门实操示例 RAG 基本介绍 通用语言模型可以进行微调以实现一些常见任务&#xff0c;例如情感分析和命名实体识别。这些任务通常不需要额外的背景知识。 对于更复杂和知识密集型的任务&#xff0c;可以构建基于语言模型的系统来访问外部知识源来完成任…

【C语言】指针知识点笔记(2)

目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

高通平台开发系列讲解(USB篇)DWC3控制USB速率

文章目录 一、设备树二、相关结构体三、最大速率设置四、当前速率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB DWC3控制USB速率。 一、设备树 目录:msm-4.14/arch/arm64/boot/dts/qcom/sdxprairie-usb.dtsi dwc3@a600000 {compatibl…

pandas之重复数据的查看、删除和提取(后附数据网盘链接)

数据预览&#xff1a; 一、 查看value_counts() 这一函数能够查看每一数据出现了几次&#xff0c;但是用data.value_counts()这一方法时&#xff0c;只有一行数据全都一样才算做重复行&#xff0c;如下图中的郭靖分数不一样的话它没有计入是重复行&#xff0c;要想以名字作为重…

unity面试题

一&#xff1a;什么是协同程序&#xff1f; 在主线程运行的同时开启另一段逻辑处理&#xff0c;来协助当前程序的执行&#xff0c;协程很像多线程&#xff0c;但是不是多线程&#xff0c;Unity的协程实在每帧结束之后去检测yield的条件是否满足。 二&#xff1a;Unity3d中的碰…

身体互联网 (IoB)

现在&#xff0c;我们的互联网网关就是我们手中的一个小设备。 普渡大学副教授施里亚斯森表示。 我们不断地看着这个盒子&#xff0c;我们低着头走路&#xff0c;我们把大部分时间都花在它上面。如果我们不想让这种未来继续下去&#xff0c;我们就需要开发新技术。相反&#x…

使用scipy处理图片——任意比例缩放

大纲 缩小放大代码地址 在《使用numpy处理图片——缩放图片》一文中&#xff0c;我们每2个取1个像素来达到图像缩小的效果。这就要求缩小的比例只能是整数倍&#xff0c;而不能支持缩小到0.3倍或者放大到1.5倍这样的效果。 为了支持任意倍数的缩放功能&#xff0c;我们需要使用…

集群服务器GPU深度模型训练笔记(PBS作用调度系统)

相关手册与软件准备 官方使用手册 用户手册&#xff1a;https://hpc.sustech.edu.cn/ref/cluster_User_Manual.pdf 培训视频&#xff1a;https://hpc.sustech.edu.cn/ref/meeting_20230810.mp4 启明2.0使用手册&#xff1a;https://hpc.sustech.edu.cn/ref/qiming_User_Manua…

基于vue+Spring Boot家政服务人员预约系统iph9d

通过对家政服务管理内容的学习研究&#xff0c;进而设计并实现一个家政服务系统。系统能实现的主要功能应包括即时通讯、通讯回复、预约订单、接单信息、服务费用管、服务评价的一些操作。还有可以正确的为用户服务&#xff0c;准确显示当前信息[5]。 开发软件有很多种可以用&…

【JVM】性能调优

一、前言 性能调优&#xff0c;顾名思义&#xff0c;就是对系统或软件的性能进行优化&#xff0c;以提高其运行效率和响应速度。在计算机科学中&#xff0c;性能调优通常涉及到硬件、操作系统、数据库、网络等多个方面。对于Java开发者来说&#xff0c;JVM&#xff08;Java虚拟…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一&#xff1a;创建自定义网络 首先&#xff0c;我们需要创建一个自定义网络&#xff0c;以便容器可以连接到这个网络上&#xff0c;从而实现互相通信。在命令行中执行以下命令&#xff1a; # 创建 docker network create ddz # 查看 docker n…

O2066PM无线WIFI6E网卡Windows环境吞吐测试

从2023年开始&#xff0c;除手机外的无线终端设备也逐步向WIFI6/6E进行升级更新&#xff0c;基于802.11ax技术的设备能够进一步满足用户体验新一代Wi-Fi标准时获得优质的性能和覆盖范围。 用户对于WIFI模块&#xff0c;通常会关注WIFI模块的吞吐量&#xff0c;拿到样品之后&am…

如何在iPhone或iPad中截取长页面,这里有详细步骤

iOS有太多隐藏的功能&#xff0c;记住它们可能是一个挑战&#xff0c;但知道如何在iPhone或iPad上截屏整个页面是我从未忘记的。 你若是一名作家&#xff0c;你经常会发现自己需要截屏网站和文章中的大块文本&#xff0c;以便发送给某人或稍后阅读。虽然现在的手机有着令人羡慕…

python统计分析——生成正态分布随机数

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 方法1&#xff1a;scipy.stats.norm.rvs() from scipy import stats stats.norm.rvs(loc4,scale0.8,size10) 参数介绍如下&#xff1a; loc&#xff1a;表示正态分布的均值&#xff0c;默认为0 scale&#…

Visual Studio Code常用设置

此处用于记录下本人所使用 VScode 的使用习惯。其中主要包括&#xff1a;界面&#xff0c;主题&#xff0c;光标&#xff0c;文件保存等选项。 VSCode 用户区设置 相关介绍命令行方式进行配置可视化组件方式进行配置 更新 相关介绍 基本原理&#xff1a; Visual Studio Code 会…