【从零开始的LeetCode-算法】3354. 使数组元素等于零

给你一个整数数组 nums

开始时,选择一个满足 nums[curr] == 0 的起始位置 curr ,并选择一个移动 方向 :向左或者向右。

此后,你需要重复下面的过程:

  • 如果 curr 超过范围 [0, n - 1] ,过程结束。
  • 如果 nums[curr] == 0 ,沿当前方向继续移动:如果向右移,则 递增 curr ;如果向左移,则 递减 curr
  • 如果 nums[curr] > 0:
    • nums[curr] 减 1 。
    • 反转 移动方向(向左变向右,反之亦然)。
    • 沿新方向移动一步。

如果在结束整个过程后,nums 中的所有元素都变为 0 ,则认为选出的初始位置和移动方向 有效

返回可能的有效选择方案数目。

示例 1:

**输入:**nums = [1,0,2,0,3]

**输出:**2

解释:

可能的有效选择方案如下:

  • 选择 curr = 3 并向左移动。
    • [1,0,2,++0++ ,3] -> [1,0,++2++ ,0,3] -> [1,0,1,++0++ ,3] -> [1,0,1,0,++3++ ] -> [1,0,1,++0++ ,2] -> [1,0,++1++ ,0,2] -> [1,0,0,++0++ ,2] -> [1,0,0,0,++2++ ] -> [1,0,0,++0++ ,1] -> [1,0,++0++ ,0,1] -> [1,++0++ ,0,0,1] -> [++1++ ,0,0,0,1] -> [0,++0++ ,0,0,1] -> [0,0,++0++ ,0,1] -> [0,0,0,++0++ ,1] -> [0,0,0,0,++1++] -> [0,0,0,0,0].
  • 选择 curr = 3 并向右移动。
    • [1,0,2,++0++ ,3] -> [1,0,2,0,++3++ ] -> [1,0,2,++0++ ,2] -> [1,0,++2++ ,0,2] -> [1,0,1,++0++ ,2] -> [1,0,1,0,++2++ ] -> [1,0,1,++0++ ,1] -> [1,0,++1++ ,0,1] -> [1,0,0,++0++ ,1] -> [1,0,0,0,++1++ ] -> [1,0,0,++0++ ,0] -> [1,0,++0++ ,0,0] -> [1,++0++ ,0,0,0] -> [++1++,0,0,0,0] -> [0,0,0,0,0].

示例 2:

**输入:**nums = [2,3,4,0,4,1,0]

**输出:**0

解释:

不存在有效的选择方案。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100
  • 至少存在一个元素 i 满足 nums[i] == 0

我的解答

java 复制代码
class Solution {
    public int countValidSelections(int[] nums) {
        int sum = 0;
        for(int num : nums){
            sum += num;
        }
        /**
         * 由示例可知,满足条件的curr左右两边差值必须小于等于1
         * 等于0,即curr左右两边的值相等时,向左向右就可
         * 等于1,即curr左右两边的值相差为1时,仅能先向值大的方向开始移动
         */
        int res = 0,pre = 0;
        for(int num : nums){
            if(num > 0){
                pre += num;
                if(pre * 2 > sum + 1) break;
            }else if(pre * 2 == sum){
                res += 2;
            }else if(Math.abs(pre * 2 - sum) == 1){
                res++;
            }
        }
        return res;
    }
}
相关推荐
艾莉丝努力练剑18 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
武子康1 小时前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
_殊途2 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
椰椰椰耶3 小时前
【Spring】拦截器详解
java·后端·spring
没有bug.的程序员4 小时前
JAVA面试宝典 - 《MyBatis 进阶:插件开发与二级缓存》
java·面试·mybatis
没有羊的王K5 小时前
SSM框架学习——day1
java·学习
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
又菜又爱coding5 小时前
安装Keycloak并启动服务(macOS)
java·keycloak
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc
wan_da_ren6 小时前
JVM监控及诊断工具-GUI篇
java·开发语言·jvm·后端