程序对非空子集进行计数,该子集的最小和最大元素之和小于Python中的k

假设我们有一个称为nums和另一个值k的数字列表,我们必须找到非空子集S的数量,使得S的最小值+ S的最大值<= k。我们必须记住,子集是多集。因此,子集中可能有重复的值,因为它们是指列表的特定元素,而不是值。

因此,如果输入像nums = [2,2,5,6],k = 7,那么输出将是6,因为我们可以制作以下子集,例如:[2],[2],[2, 2],[2、5],[2、5],[2、2、5]。

为了解决这个问题,我们将遵循以下步骤-

  • N:= A的大小

  • 排序列表A

  • 回答:= 0

  • j:= N-1

  • 对于0到N范围内的i,执行

    • ans:= ans + 2 ^(j-i)

    • j:= j-1

    • 当j和A [i] + A [j]> K时,

    • 如果i <= j并且A [i] + A [j] <= K,则

    • 返回ans

    让我们看下面的实现以更好地理解-

    示例

    class Solution:
       def solve(self, A, K):
          N = len(A)
          A.sort()
          ans = 0
          j = N - 1
          for i in range(N):
             while j and A[i] + A[j] > K:
                j -= 1
                if i <= j and A[i] + A[j] <= K:
                   ans += 1 << (j - i)
          return ans
    ob = Solution()nums = [2, 2, 5, 6]
    k = 7 print(ob.solve(nums, k))

    输入项

    [2, 2, 5, 6]

    输出结果

    6
    猜你喜欢