当前位置:   article > 正文

贪心+位运算,LeetCode 1969. 数组元素的最小非零乘积

贪心+位运算,LeetCode 1969. 数组元素的最小非零乘积

一、题目

1、题目描述

给你一个正整数 p 。你有一个下标从 1 开始的数组 nums ,这个数组包含范围 [1, 2p - 1] 内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:

  • 从 nums 中选择两个元素 x 和 y  。
  • 选择 x 中的一位与 y 对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。

比方说,如果 x = 1101 且 y = 0011 ,交换右边数起第 2 位后,我们得到 x = 1111 和 y = 0001 。

请你算出进行以上操作 任意次 以后,nums 能得到的 最小非零 乘积。将乘积对 109 + 7 取余 后返回。

注意:答案应为取余 之前 的最小值。

2、接口描述

  1. class Solution {
  2. public:
  3. typedef long long LL;
  4. LL mod = 1e9 + 7;
  5. LL qp(LL a, LL b){
  6. a %= mod;
  7. LL ret = 1;
  8. while(b){
  9. if(b & 1) ret = ret * a % mod;
  10. b >>= 1, a = a * a % mod;
  11. }
  12. return ret;
  13. }
  14. int minNonZeroProduct(LL p) {
  15. LL k = (1LL << p) - 1;
  16. return k % mod * qp(k - 1, k >> 1) % mod;
  17. }
  18. };

3、原题链接

1969. 数组元素的最小非零乘积


二、解题报告

1、思路分析

任给两个数a,b,不妨设a < b,a给b1是否能让a * b变小呢?

我们不妨设a = x + 2 ^ k,b = y,(y的第k位为0)

那么交换前有a * b = xy + y * 2 ^ k

交换后a = x,b = y + 2 ^ k,a *b = xy + x * 2 ^ k

由于x < y,所以结果变小

然后对于[1, 2 ^ p - 1]这2 ^ p - 1个数字,我们可以分为[1, 2 ^ (p - 1) - 1],[2 ^ (p - 1), 2 ^ p - 2],2 ^ p - 1

我们发现[1, 2 ^ (p - 1) - 1],[2 ^ (p - 1), 2 ^ p - 2]可以配成偶数对没有相同1的数对,而且两两相加为2 ^ p - 1

如p = 3,则可分为[1, 2, 3]、[4, 5, 6]、7

1 + 6 = 7,2 + 5 = 7,3 + 4 = 7,左边区间可以将除最低位1外的所有1都给右边,于是得到

1,1,1,6,6,6,7

不难证明左边区间保留最低位1时比保留其它位1更优

于是给定p,我们的答案就是 (2 ^ p - 1) * pow(2 ^ p - 2, 2 ^ (p - 1) - 1)

2、复杂度

时间复杂度:O(p) 空间复杂度:O(1)

3、代码详解

​cpp
  1. class Solution {
  2. public:
  3. typedef long long LL;
  4. LL mod = 1e9 + 7;
  5. LL qp(LL a, LL b){
  6. a %= mod;
  7. LL ret = 1;
  8. while(b){
  9. if(b & 1) ret = ret * a % mod;
  10. b >>= 1, a = a * a % mod;
  11. }
  12. return ret;
  13. }
  14. int minNonZeroProduct(LL p) {
  15. LL k = (1LL << p) - 1;
  16. return k % mod * qp(k - 1, k >> 1) % mod;
  17. }
  18. };
python3
  1. class Solution:
  2. def minNonZeroProduct(self, p: int) -> int:
  3. MOD = 1_000_000_007
  4. k = (1 << p) - 1
  5. return k * pow(k - 1, k >> 1, MOD) % MOD

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/279592
推荐阅读
相关标签
  

闽ICP备14008679号