Description
You are given a 0-indexed integer array nums representing the strength of some heroes. The power of a group of heroes is defined as follows:
- Let
i0,i1, ... ,ikbe the indices of the heroes in a group. Then, the power of this group ismax(nums[i0], nums[i1], ... ,nums[ik])2 * min(nums[i0], nums[i1], ... ,nums[ik]).
Return the sum of the power of all non-empty groups of heroes possible. Since the sum could be very large, return it modulo 109 + 7.
Example 1:
Input: nums = [2,1,4] Output: 141 Explanation: 1st group: [2] has power = 22 * 2 = 8. 2nd group: [1] has power = 12 * 1 = 1. 3rd group: [4] has power = 42 * 4 = 64. 4th group: [2,1] has power = 22 * 1 = 4. 5th group: [2,4] has power = 42 * 2 = 32. 6th group: [1,4] has power = 42 * 1 = 16. 7th group: [2,1,4] has power = 42 * 1 = 16. The sum of powers of all groups is 8 + 1 + 64 + 4 + 32 + 16 + 16 = 141.
Example 2:
Input: nums = [1,1,1] Output: 7 Explanation: A total of 7 groups are possible, and the power of each group will be 1. Therefore, the sum of the powers of all groups is 7.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 109
Solutions
Solution 1: Sorting + Mathematics
We notice that the problem involves the maximum and minimum values of a subsequence, and the order of elements in the array does not affect the final result. Therefore, we can sort the array first.
Next, we enumerate each element as the minimum value of the subsequence. Let's denote each element of the array as a1, a2, …, an. The contribution of the subsequence with ai as the minimum value is:
We notice that each ai will be multiplied by ai^2, which we can directly add to the answer. For the remaining part, we can maintain it with a variable p, initially set to 0.
Then, we enumerate ai from right to left. Each time, we add ai × p to the answer, and then set p = p × 2 + ai^2.
After enumerating all ai, return the answer.
The time complexity is O(n × log n), and the space complexity is O(log n). Here, n is the length of the array.
class Solution: def sumOfPower(self, nums: List[int]) -> int: mod = 10**9 + 7 nums.sort() ans = 0 p = 0 for x in nums[::-1]: ans = (ans + (x * x % mod) * x) % mod ans = (ans + x * p) % mod p = (p * 2 + x * x) % mod return ans(code-box)
