📌  相关文章
📜  可被给定数k整除的数组的最小和最大元素(1)

📅  最后修改于: 2023-12-03 15:37:09.364000             🧑  作者: Mango

可被给定数k整除的数组的最小和最大元素介绍

1. 简介

有一个整数数组,现在需要找到其中一个最小值和一个最大值,使得它们的和可以被给定数k整除。如果找不到这样的一组最小和最大元素,返回[-1,-1]。

2. 解题思路

先对原数组进行排序,然后设置左右两个指针left和right分别指向数组的第一个和最后一个元素。每次比较left和right所指元素的和与k的余数,如果余数为0,则返回[left, right];如果余数小于0,则left向右移动一位,否则right向左移动一位。如果left和right相遇时还没有找到能被k整除的和,则返回[-1, -1]。

3. 代码实现
def minMaxDivisible(arr, k):
    arr.sort()
    left, right = 0, len(arr) - 1
    while left < right:
        s = arr[left] + arr[right]
        if s % k == 0:
            return [arr[left], arr[right]]
        elif s % k < 0:
            left += 1
        else:
            right -= 1
    return [-1, -1]
4. 示例
arr = [3, 1, 4, 2, 9, 5, 10]
k = 5
print(minMaxDivisible(arr, k)) # [1, 4]

arr = [3, 1, 4, 2, 9, 5, 10]
k = 7
print(minMaxDivisible(arr, k)) # [3, 4]

arr = [3, 1, 4, 2, 9, 5, 10]
k = 8
print(minMaxDivisible(arr, k)) # [-1, -1]
5. 总结

通过排序和双指针的方法,可以很容易地找出一个数组中能被k整除的最小和最大元素。注意排序的时间复杂度是O(nlogn),因此整个算法的时间复杂度也是O(nlogn)。