leetcode:心算挑战

avatar
作者
筋斗云
阅读量:0

题目:

        心算项目的挑战比赛中,要求选手从N张卡牌中选出cnt张卡牌,若这cnt张卡牌数字总和为偶数,则选手成绩「有效」且得分为cnt张卡牌数字总和。给定数组cardscnt,其中cards[i]表示第i张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回0

示例 :

输入

输出

解释
cards = [1,2,8,9]
cnt = 3
18选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。
cards = [3,3,1]
cnt = 1
0不存在获取有效得分的卡牌方案。

提示:

  • 1<=cnt<=cards.length<=10^5
  • 1<=cards[i]<=1000

题解:

思路:

        将 cards 从大到小排序后,先贪心的将后 cnt 个数字加起来,若此时 sum 为偶数,直接返回即可。若此时答案为奇数,有两种方案:

        在数组前面找到一个最大的奇数与后 cnt 个数中最小的偶数进行替换;

        在数组前面找到一个最大的偶数与后 cnt 个数中最小的奇数进行替换。

代码:Python

def leet_code(cards, cnt):     cards.sort(reverse=True)  # 排序,从大到小、     left, right = cards[0:cnt], cards[cnt:]     num = sum(left)      if num % 2 == 0:         return num     if num % 2 != 0 and len(cards) == cnt:         return 0      odd, even = 0, 0     for i in right:  # 剩余数据的最大奇数和最大偶数         if odd == 0 and i % 2 != 0:             odd = i         if even == 0 and i % 2 == 0:             even = i      ans = list()     for i in left:  # 所有和的可能         ans.append(num - i + odd)         ans.append(num - i + even)     ans.sort(reverse=True)     for i in ans:  # 返回最大偶数         if i % 2 == 0:             return i   if __name__ == '__main__':     cards = [1, 2, 8, 9]     cnt = 3     res = leet_code(cards, cnt)     print(res) 

总结:

题目内容来源于leetcode链接:心算挑战

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!