首页 > 其他分享 >力扣每日一题2023.1.28---1664. 生成平衡数组的方案数

力扣每日一题2023.1.28---1664. 生成平衡数组的方案数

时间:2023-01-28 17:13:17浏览次数:42  
标签:力扣 下标 nums int 元素 28 sum0 --- 数组

给你一个整数数组 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 是 平衡数组 的 方案数 。

示例 1:
输入:nums = [2,1,6,4]
输出:1
解释:
删除下标 0 :[1,6,4] -> 偶数元素下标为:1 + 4 = 5 。奇数元素下标为:6 。不平衡。
删除下标 1 :[2,6,4] -> 偶数元素下标为:2 + 4 = 6 。奇数元素下标为:6 。平衡。
删除下标 2 :[2,1,4] -> 偶数元素下标为:2 + 4 = 6 。奇数元素下标为:1 。不平衡。
删除下标 3 :[2,1,6] -> 偶数元素下标为:2 + 6 = 8 。奇数元素下标为:1 。不平衡。
只有一种让剩余数组成为平衡数组的方案。

示例 2:
输入:nums = [1,1,1]
输出:3
解释:你可以删除任意元素,剩余数组都是平衡数组。

示例 3:
输入:nums = [1,2,3]
输出:0
解释:不管删除哪个元素,剩下数组都不是平衡数组。

提示:
    1 <= nums.length <= 105
    1 <= nums[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ways-to-make-a-fair-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

从刚开始两数之和就是梦结束的地方,到现在中下难度的题大部分都可以做出来,感慨颇多。

这道题我应该是用了动态规划的思想(虽然我到现在也还是只知道动态规划是空间换时间(〃'▽'〃))。

可以发现,每次删除掉一个下标为i的元素,之后的元素都会奇偶互换,而这个元素之前的元素不会改变。

我们可以用两个变量来存储前面元素的奇偶和,每次对后面元素的奇偶和进行互换。

这样只需要对数组进行两次遍历,时间复杂度为O(N),n 为数组长度。

代码如下:

class Solution {
    public int waysToMakeFair(int[] nums) {
//        存储删除元素后面的下标为偶数元素的和。
        int sum0 = 0;
//        存储删除元素后面的下标为奇数元素的和。
        int sum1 = 0;
        
        for (int i = 0; i < nums.length; i ++) {
            if (i % 2 == 0) {
                sum0 += nums[i];
            } else {
                sum1 += nums[i];
            }
        }
//        存储最终结果
        int res = 0;
//        存储删除元素前面的下标为偶数的元素的和。
        int tem0 = 0;
//        存储删除元素前面的下标为奇数的元素的和。
        int tem1 = 0;
        for (int i = 0; i < nums.length; i ++) {
//            i分别为奇数和偶数时,前面元素的下标奇数和以及下标偶数和分别加上nums[i]
            if (i % 2 == 0) {
                sum0 -= nums[i];
//                删除元素后面元素互换。算数表达式在运行时应该是利用栈来实现的,利用这个特点,可以省空间。
                sum0 = sum1 + (sum1 = sum0) - sum0;
                if (tem0 + sum0 == tem1 + sum1) {
                    res ++;
                }
                tem0 += nums[i];
            } else {
                sum1 -= nums[i];
                sum0 = sum1 + (sum1 = sum0) - sum0;
                if (tem0 + sum0 == tem1 + sum1) {
                    res ++;
                }
                tem1 += nums[i];
            }
//            再次互换。
            sum0 = sum1 + (sum1 = sum0) - sum0;
        }
        return res;
    }
}

运行结果:

运行结果

 

我用的就是动态规划,放一个官解。

class Solution {
    public int waysToMakeFair(int[] nums) {
        int odd1 = 0, even1 = 0;
        int odd2 = 0, even2 = 0;
        for (int i = 0; i < nums.length; ++i) {
            if ((i & 1) != 0) {
                odd2 += nums[i];
            } else {
                even2 += nums[i];
            }
        }
        int res = 0;
        for (int i = 0; i < nums.length; ++i) {
            if ((i & 1) != 0) {
                odd2 -= nums[i];
            } else {
                even2 -= nums[i];
            }
            if (odd1 + even2 == odd2 + even1) {
                ++res;
            }
            if ((i & 1) != 0) {
                odd1 += nums[i];
            } else {
                even1 += nums[i];
            }
        }
        return res;
    }
}

官解

 

标签:力扣,下标,nums,int,元素,28,sum0,---,数组
From: https://www.cnblogs.com/allWu/p/17070869.html

相关文章

  • Educational Codeforces Round 2 个人总结A-D
    EducationalCodeforcesRound3A.USBFlashDrives降序排序后,贪心,甚至不会爆longlongvoidsolve(){intn,m;cin>>n>>m;vector<int>a(n);for(......
  • JavaWeb-Filter&Listener
    JavaWeb-Filter&Listener1,Filter1.1Filter概述Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现......
  • 时序预测 | MATLAB实现SSA-KELM和KELM麻雀算法优化核极限学习机时间序列预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • GRPC与JSON-RPC区别
      GRPC与JSON-RPC都是rpc的一种。 一.RPCRPC是什么RPC(RemoteProcedureCall)指的是远程过程调用,简单的说,RPC就是从一台机器上通过参数传递的方式调用另一台......
  • Squirrel状态机-从原理探究到最佳实践
    作者:京东物流郑朋辉1简介Squirrel状态机是一种用来进行对象行为建模的工具,主要描述对象在它的生命周期内所经历的状态,以及如何响应来自外界的各种事件。比如订单的创建......
  • vnc登录centos虚拟机 命令行显示sh-4.2#处理
    一、需求centos操作系统安装软件有些需要图形化界面,比如安装oracle数据库。二、问题解决执行source/root/.bashrc~/.bashrc:该文件包含专用于你的bashshell的bash信......
  • HO引擎近况20230128
    好几个月忘了写随笔了家里的事儿,公司的事儿,活着累,心累,阳过之后感觉身体也越来越差真想找一个地方躲一下每天半夜12点之后,我出门去遛狗,带着耳机,这是我最放松的时......
  • X64\X86\X86-64的区别
    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA-32”x8......
  • mysql忘记密码-查看用户名-重置-修改密码
    超详细,适用mysql-5.7.9以上(绝对有用)  第一步:管理员打开cmd运行下面一条指令  netstopmysql    第二步:运行下面指令  mysqld--con......
  • 压测工具-wrk
    1.简介wrk是一款简单的HTTP压测工具,托管在[gitHub](https://links.jianshu.com/go?to=https://github.com/wg/wrk)上。gitHub地址:https://github.com/wg/wrk.git。w......