📌  相关文章
📜  给定范围内的数字的最大奇数和(1)

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

给定范围内的数字的最大奇数和

问题描述

编写一个函数,给定一个包含n个整数的数组a和两个整数l和r,该函数应返回在[l, r]范围内的数字中的最大奇数和。如果没有奇数,则返回0。

函数原型
def max_odd_sum(a: List[int], l: int, r: int) -> int:
    pass
输入参数
  • a: 一个包含n个整数的数组 (1 ≤ n ≤ 10^5);
  • l: 一个整数,表示范围的左端点 (1 ≤ l ≤ r ≤ n);
  • r: 一个整数,表示范围的右端点 (1 ≤ l ≤ r ≤ n)。
输出
  • 返回在[l, r]范围内的数字中的最大奇数和。如果没有奇数,则返回0。
例子
assert max_odd_sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 2, 5) == 9
assert max_odd_sum([2, 4, 6, 8, 10], 1, 5) == 0
assert max_odd_sum([3, 4, 5, 6, 7], 1, 3) == 5
解题思路

对于[l, r] 范围内的数字中的最大奇数和,我们可以先将[l, r] 区间的数分解成奇数和偶数。

然后将奇数从大到小排序,累加相邻的奇数即可。

代码
from typing import List


def max_odd_sum(a: List[int], l: int, r: int) -> int:
    # 获取 [l, r] 区间内的奇数
    odd = [x for x in a[l - 1: r] if x % 2 == 1]
    # 如果区间内没有奇数,返回 0
    if not odd:
        return 0
    # 奇数从大到小排序
    odd.sort(reverse=True)
    # 累加相邻奇数
    return sum(odd[i] for i in range(len(odd)) if i % 2 == 0)
复杂度分析
  • 时间复杂度:O(n log n),主要用于排序操作;
  • 空间复杂度:O(n),用于存储奇数数组。