这里写目录标题
- 一、414. 第三大的数
- 二、448. 找到所有数组中消失的数字
- 三、561. 数组拆分
- 四、594. 最长和谐子序列
一、414. 第三大的数
简单
给你一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为1 。
def func414(nums):
nums.sort()
nums = list(set(nums))
if len(nums) < 3:
return nums[-1]
else:
return nums[-3]
nums = [3, 2, 1]
res = func414(nums)
print(res)
二、448. 找到所有数组中消失的数字
简单
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:
输入:nums = [1,1]
输出:[2]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
def func448(nums):
print(set(range(len(nums) + 1)))
return list(set(range(1, len(nums) + 1)) - set(nums))
nums = [4, 3, 2, 7, 8, 2, 3, 1]
res = func448(nums)
print(res)
三、561. 数组拆分
简单
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。返回该 最大总和 。
示例 1:
输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
- (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
- (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
- (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4
示例 2:
输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9
思路:
我们先研究一个整数队(a,b),假设里面较小的是a,那么无论b多大,累加到答案中的就只是a
因此,我们构造(a,b)时,使这两个元素之差尽可能地小,才能尽可能地“不浪费”较大的b
那么方法就出来了,直接对原始数组排个序,相邻元素两两成对即可。
def func561(nums):
nums.sort()
print(nums)
ans = 0
for i in range(0, len(nums), 2):
ans += nums[i]
return ans
nums = [6, 2, 6, 5, 1, 2]
print(func561(nums))
四、594. 最长和谐子序列
简单
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例 1:
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
示例 2:
输入:nums = [1,2,3,4]
输出:2
示例 3:
输入:nums = [1,1,1,1]
输出:0
思路:首先将数组排序,得到递增数组
然后进行遍历一次数组,利用双指针实现类似滑动窗口的功能
def func594(nums):
nums.sort()
print(nums)
l = 0
ans = 0
for r in range(len(nums)):
while nums[r] - nums[l] > 1:
l += 1
if nums[r] - nums[l] == 1:
ans = max(ans, r - l + 1)
return ans
nums = [1, 3, 2, 2, 5, 2, 3, 7]
print(func594(nums))