LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积
Posted Zephyr丶J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积相关的知识,希望对你有一定的参考价值。
1460. 通过翻转子数组使两个数组相等
2022.8.24 每日一题
题目描述
给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。
如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。
示例 1:
输入:target = [1,2,3,4], arr = [2,4,1,3]
输出:true
解释:你可以按照如下步骤使 arr 变成 target:
1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3]
2- 翻转子数组 [4,2] ,arr 变成 [1,2,4,3]
3- 翻转子数组 [4,3] ,arr 变成 [1,2,3,4]
上述方法并不是唯一的,还存在多种将 arr 变成 target 的方法。
示例 2:
输入:target = [7], arr = [7]
输出:true
解释:arr 不需要做任何翻转已经与 target 相等。
示例 3:
输入:target = [3,7,9], arr = [3,7,11]
输出:false
解释:arr 没有数字 9 ,所以无论如何也无法变成 target 。
提示:
target.length == arr.length
1 <= target.length <= 1000
1 <= target[i] <= 1000
1 <= arr[i] <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/make-two-arrays-equal-by-reversing-sub-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
class Solution:
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
# 想想是不是只要数字都一样,就能翻转成一样的
# 确定第一位,只需要找到第一位存在的位置k,然后翻转前k位就可以了
# 然后后面的同理,就可以得到一样的数字
# 所以只需要判断两个数组中数字是否是一样的就行了
count = [0] * 1001
for i in range(len(target)):
count[target[i]] += 1
count[arr[i]] -= 1
for k in count:
if k != 0:
return False
return True
class Solution:
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
return Counter(target) == Counter(arr)
658. 找到 K 个最接近的元素
2022.8.25 每日一题
题目描述
给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。
整数 a 比整数 b 更接近 x 需要满足:
- |a - x| < |b - x| 或者
- |a - x| == |b - x| 且 a < b
示例 1:
输入:arr = [1,2,3,4,5], k = 4, x = 3
输出:[1,2,3,4]
示例 2:
输入:arr = [1,2,3,4,5], k = 4, x = -1
输出:[1,2,3,4]
提示:
1 <= k <= arr.length
1 <= arr.length <= 10^4
arr 按 升序 排列
-10^4 <= arr[i], x <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-k-closest-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
要找到自身的定位很重要
class Solution:
def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
# 先找到这个数插入的位置,然后在这个位置扩散
# 左右比较,如果左边绝对值小或者等于就扩散左边,直到满足k个
# 如果数组中有元素和该元素相同,那么插入的位置应该是在这个元素之后
# 这样不管是相同还是不相同都可以一起处理,所以用的是 bisect_right
idx = bisect_right(arr, x)
res = []
i, j = idx - 1, idx
while len(res) < k:
left = abs(arr[i] - x) if i >= 0 else -1
right = abs(arr[j] - x) if j < len(arr) else -1
if (i >= 0 and left <= right) or right < 0:
res.insert(0, arr[i])
i -= 1
else:
res.append(arr[j])
j += 1
return res
1464. 数组中两元素的最大乘积
2022.8.26 每日一题
题目描述
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
示例 1:
输入:nums = [3,4,5,2]
输出:12
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1)(5-1) = 3*4 = 12 。
示例 2:
输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
示例 3:
输入:nums = [3,7]
输出:12
提示:
2 <= nums.length <= 500
1 <= nums[i] <= 10^3
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-product-of-two-elements-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
暴力
class Solution:
def maxProduct(self, nums: List[int]) -> int:
# 首先暴力,练着写代码
i = 0
res = 0
while i < len(nums) - 1:
j = i + 1
while j < len(nums):
res = max(res, (nums[i] - 1) * (nums[j] - 1))
j += 1
i += 1
return res
一行
class Solution:
def maxProduct(self, nums: List[int]) -> int:
# 首先暴力,练着写代码
return max([(nums[i] - 1) * (nums[j] - 1) for i in range(len(nums) - 1) for j in range(i + 1, len(nums))])
排序
class Solution:
def maxProduct(self, nums: List[int]) -> int:
# 因为都是大于1的数字,排序
nums.sort(reverse= True)
return (nums[0] - 1) * (nums[1] - 1)
一次遍历,维护前二的值
class Solution:
def maxProduct(self, nums: List[int]) -> int:
# 直接找前两个最大的值
max1, max2 = 0, 0
for n in nums:
if n > max1:
max1, max2 = n, max1
elif n > max2:
max2 = n
return (max1 - 1) * (max2 - 1)
以上是关于LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积