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

2024-01-16 07:36

本文主要是介绍【数据结构与算法】之数组系列-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 resL=i+1R=n-1while 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+1while L<R and nums[R]==nums[R-1]:R=R-1L=L+1R=R-1elif nums[i]+nums[L]+nums[R]>0:R=R-1else:L=L+1return resnums = [-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=infnums.sort()n=len(nums)if n<3:return []for i in range(n):L=i+1R=n-1while L<R:if nums[i]+nums[L]+nums[R]==target:return targett=nums[i]+nums[L]+nums[R]if abs(t-target)<abs(ans-target):ans=tif t>target:R=R-1else:L=L+1return anss = 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 = 0max_sum = nums[0]i = 0while i < len(nums):if pre < 0:pre = 0pre = pre + nums[i]     # -2     1if max_sum < pre:       # -2<0   -2<1max_sum = pre       # 0      1i += 1                  # 1      2return max_sumnums = [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 numsdef reverse(self,nums,start,end):while start<end:nums[start],nums[end]=nums[end],nums[start]start+=1end-=1ss=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)

在这里插入图片描述

这篇关于【数据结构与算法】之数组系列-20240116的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611766

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的