【每日一题Day101】LC1664生成平衡数组的方案数 | 预处理+枚举
创始人
2024-05-19 18:16:39
0

生成平衡数组的方案数【LC1664】

给你一个整数数组 nums 。你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。

比方说,如果 nums = [6,1,7,4,1] ,那么:

  • 选择删除下标 1 ,剩下的数组为 nums = [6,7,4,1]
  • 选择删除下标 2 ,剩下的数组为 nums = [6,1,4,1]
  • 选择删除下标 4 ,剩下的数组为 nums = [6,1,7,4]

如果一个数组满足奇数下标元素的和与偶数下标元素的和相等,该数组就是一个 平衡数组

请你返回删除操作后,剩下的数组 nums平衡数组方案数

出去玩好累 不想出去玩了

预处理+枚举

  • 思路:

    • 枚举每一个删除的位置,判断删除后奇数下标元素之和与偶数下标元素之和是否相等。假设删除的下标为iii,那么nums[0,i-1]范围内的奇偶性不变,nums[i+1,n-1]范围内的下标奇偶性倒置,奇数下标变为偶数下标,偶数下标变为奇数下标。由此可得:
      • 删除后奇数下标元素之和=nums[0,i-1]中奇数下标元素之和+nums[i+1,n-1]中偶数下标元素之和
      • 删除后偶数下标元素之和=nums[0,i-1]中偶数下标元素之和+nums[i+1,n-1]中奇数下标元素之和
    • 因此可以计算原数组的奇数下标元素和偶数下标元素的前缀和数组oddSumevenSum,快速计算出某个范围内的奇数之和或者偶数之和
      • oddSum[i]代表前iii个奇数之和
      • evenSum[i]代表前iii个偶数之和
  • 实现:两个前缀和数组

    class Solution {public int waysToMakeFair(int[] nums) {       int n = nums.length;if (n == 1) return 1;int[] oddSum = new int[n];int[] evenSum = new int[n];// 初始化前缀和数组evenSum[0] = nums[0];evenSum[1] = nums[0];oddSum[1] = nums[1];int count = 0;for (int i = 2; i < n; i++){if (i % 2 == 0){evenSum[i] = evenSum[i - 2] + nums[i];oddSum[i] = oddSum[i - 1];}else{oddSum[i] = oddSum[i - 2] + nums[i];evenSum[i] = evenSum[i - 1];}}// 枚举每个下标for (int i = 0; i < n; i++){int odd = i >= 1 ? oddSum[i - 1]  : 0;odd += evenSum[n - 1] - evenSum[i]; int even = i >= 1 ? evenSum[i - 1] : 0;even += oddSum[n - 1] - oddSum[i];                       if (even == odd){count++;}           }return count;}
    }
    
    • 复杂度分析

      • 时间复杂度:O(n)O(n)O(n)
      • 空间复杂度:O(n)O(n)O(n)
  • 优化1:思路同上,枚举每个位置iii,仍是将和分为两个部分oddeven,使用int变量代替前缀和数组,优化空间复杂度。

    • 首先预处理得到原始数组的偶数下标元素之和s1s_1s1​和奇数下标之和s2s_2s2​,并记录当前枚举到的偶数下标之和t1t_1t1​以及奇数下标之和t2t_2t2​

    • 然后计算两个和,由于删除下标iii后,奇偶性倒置,因此根据iii进行处理

      odd=nums[0,i-1]中奇数下标元素之和+nums[i+1,n-1]中偶数下标元素之和

      even=nums[0,i-1]中偶数下标元素之和+nums[i+1,n-1]中奇数下标元素之和

      • 若iii为偶数
        even=t1+s2−t2odd=t2+s1−t1−nums[i]even = t_1+s_2-t_2\\ odd = t_2+s_1-t_1-nums[i] even=t1​+s2​−t2​odd=t2​+s1​−t1​−nums[i]

      • 若iii为奇数
        even=t1+s2−t2−nums[i]odd=t2+s1−t1even = t_1+s_2-t_2-nums[i]\\ odd = t_2+s_1-t_1 even=t1​+s2​−t2​−nums[i]odd=t2​+s1​−t1​

    class Solution {public int waysToMakeFair(int[] nums) {int s1 = 0, s2 = 0;int n = nums.length;for (int i = 0; i < n; ++i) {s1 += i % 2 == 0 ? nums[i] : 0;s2 += i % 2 == 1 ? nums[i] : 0;}int t1 = 0, t2 = 0;int ans = 0;for (int i = 0; i < n; ++i) {int v = nums[i];ans += i % 2 == 0 && t2 + s1 - t1 - v == t1 + s2 - t2 ? 1 : 0;ans += i % 2 == 1 && t2 + s1 - t1 == t1 + s2 - t2 - v ? 1 : 0;t1 += i % 2 == 0 ? v : 0;t2 += i % 2 == 1 ? v : 0;}return ans;}
    }作者:ylb
    链接:https://leetcode.cn/problems/ways-to-make-a-fair-array/solutions/2078792/by-lcbin-3jl3/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度分析

      • 时间复杂度:O(n)O(n)O(n)
      • 空间复杂度:O(1)O(1)O(1)
  • 优化2:将优化1中的4个变量化简成一个变量s=odd1−even1−odd2+even2s=odd1-even1-odd2+even2s=odd1−even1−odd2+even2

    • 首先将所有偶数下标元素累加至s,将所有奇数下标累减至s
    • 然后枚举每个iii,当iii为奇数时累加,为偶数时减,当 s == 0 时答案加一

    odd1 + even2 == odd2 + even1 变形得 odd1 - even1 == odd2 - even2,这样可以化简成两个变量 s1 = odd1 - even1s2 = odd2 - even2,如果 s1 == s2 答案就加一。s1s2 的更新就是 i 为奇数加,为偶数减。

    再变形成 s1 - s2 == 0,那么令 s = s1 - s2,就可以化简成一个变量了,当 s == 0 时答案加一。

    class Solution {public int waysToMakeFair(int[] nums) {       int n = nums.length;int s = 0, count = 0;for (int i = 0; i < n; i++){s += i % 2 == 0 ? nums[i] : -nums[i];// 后}for (int i = 0; i < n; i++){s += i % 2 == 0 ? -nums[i] : nums[i];// 前+?if (s == 0) count++;s += i % 2 == 0 ? -nums[i] : nums[i];// 后+?}return count;}
    }
    
    • 复杂度分析

      • 时间复杂度:O(n)O(n)O(n)
      • 空间复杂度:O(1)O(1)O(1)

相关内容

热门资讯

安卓系统能转什么系统好,探索最... 你有没有想过,你的安卓手机是不是也能换换口味,体验一下其他系统的魅力呢?没错,今天就来聊聊这个话题:...
龙之狂热安卓系统,释放龙族狂热 亲爱的手机控们,你是否曾为拥有一款独特的安卓系统而疯狂?今天,就让我带你走进一个充满奇幻色彩的龙之狂...
vivo手机安卓系统怎么升级系... 亲爱的手机控们,你是不是也和我一样,对手机的新功能充满期待呢?尤其是vivo手机的用户,是不是也在想...
鸿蒙2.0退回安卓系统,一场系... 你知道吗?最近科技圈里可是炸开了锅,因为华为的鸿蒙2.0操作系统竟然要退回安卓系统了!这可不是一个简...
安卓系统怎么复制卡,安卓系统卡... 你有没有遇到过这种情况:手机里的照片、视频或者重要文件,突然想备份到电脑上,却发现安卓系统的卡复制功...
app兼容低安卓系统,打造全民... 你有没有发现,现在手机APP更新换代的速度简直就像坐上了火箭!不过,你知道吗?有些APP可是特别贴心...
中间安卓系统叫什么,中间安卓系... 你有没有想过,安卓系统里竟然还有一个中间的版本?没错,就是那个让很多手机用户既熟悉又陌生的版本。今天...
安卓怎么用os系统,利用And... 你有没有想过,你的安卓手机其实可以变身成一个功能强大的操作系统呢?没错,就是那个我们平时在电脑上使用...
pe系统安卓能做么,探索安卓平... 亲爱的读者,你是否曾好奇过,那款在安卓设备上大受欢迎的PE系统,它究竟能做什么呢?今天,就让我带你一...
安卓 打印机系统,安卓打印机系... 你有没有想过,家里的安卓手机和打印机之间竟然能建立起如此紧密的联系?没错,就是那个安卓打印机系统!今...
安卓系统视频做铃声,轻松将视频... 你有没有想过,手机里那些动人心弦的视频,竟然可以变成手机铃声?没错,就是那种一响起就能瞬间抓住你耳朵...
海信电视安卓系统更新,畅享智能... 亲爱的电视迷们,你是否也像我一样,对家里的那台海信电视充满了期待?最近,海信电视安卓系统迎来了一次大...
安卓系统网页不能载入,排查与解... 最近是不是你也遇到了安卓系统网页不能载入的烦恼?别急,让我来帮你一探究竟,找出解决之道!一、问题现象...
赛欧3安卓系统,智能出行新体验 你有没有发现,现在的汽车越来越智能了?这不,我最近就发现了一款特别有意思的车型——赛欧3,它竟然搭载...
能装安卓系统吗,哪些设备能轻松... 你有没有想过,那些看起来普普通通的平板电脑,其实里面藏着大大的秘密呢?没错,就是能装安卓系统!今天,...
安卓能变苹果系统吗,技术揭秘与... 你有没有想过,安卓手机能不能变成苹果系统呢?这听起来就像是科幻电影里的情节,但今天,我们就来揭开这个...
车载安卓系统好卡,车载安卓系统... 你有没有遇到过这样的情况?你的车载安卓系统突然变得超级卡,就像蜗牛一样慢吞吞的,让人抓狂!没错,我就...
安卓系统怎样删除固件,轻松优化... 你有没有遇到过这种情况:手机里的安卓系统突然变得卡顿,或者某个固件版本让你觉得不爽,想要重新来过?别...
安卓鸿蒙系统视频对比,性能与体... 亲爱的读者们,你是否也像我一样,对安卓和鸿蒙系统之间的较量充满了好奇?今天,就让我们一起揭开这场科技...
电脑安卓系统横评,横跨性能与体... 你有没有想过,你的手机和电脑,其实就像两个超级英雄,各有各的本领和特点?今天,就让我带你来一场电脑安...