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. 数组中两元素的最大乘积

每日一题1460. 通过翻转子数组使两个数组相等

数组与字符串:翻转子串

翻转子数组得到最大的数组值(数学题)

翻转子串

1.8字符串- 翻转子串