LeetCode1658.将x减到0的最小操作数

题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

1.常规解法(会超时)

题目的要求为要在数组的首、尾找到最少的若干个数,使得这些数的和等于x,若直接从题目条件入手,会发现要一会判断数组首元素,一会又要判断数组最后一个元素,就会非常麻烦,于是我们可以转变题目的意思,即在数组中找到若干个相邻的数使得这些数的和等于数组全部元素的和减去目标值;

首先求数组全部元素的和,再遍历数组,找到和大于等于目标值的部分退出循环,若该部分的和等于目标值,则更新操作数,再继续下一轮遍历,代码如下:

java 复制代码
    public int minOperations(int[] nums, int x) {
        int sum = 0;
        for (int i : nums) {
            sum += i;
        }
        int n = nums.length;
        int count = n + 1;
        for (int i =0; i < n; i++) {
            int sum1 = 0;
            int j = i;
            for (; j < n; j++) {
                if (sum1 >= sum - x) {
                    break;
                }
                sum1 += nums[j];
            }
            if (sum1 == sum - x) {
                count = Math.min(count, n - (j - i));
            }
        }
        return count == n + 1 ? -1 : count;
    }

2.滑动窗口

在常规解法中,当第一轮循环结束后,结果为"3 2 20",第二轮循环结果为"2 20",其中的"2 20"重复算了两次,这时就可以使用滑动窗口解决问题。

先求出数组所有元素的和sum,再定义两个指针left和right,两指针均指向数组首元素,再定义变量sum1用来表示子数组中的元素的和,用count来表示最小的操作数;

先用sum1加上right指向的元素,再将right向右移动一位,当sum1>sum - x时,用sum1减去left指向的元素,再将left向右移动,若存在sum1 == sum - x时,更新count的值,之后再次进行循环;

为了提高代码运行的效率,sum小于x时,就说明数组中没有符合条件的操作数,直接返回-1;当sum==x时,说明数组中所有元素均是符合条件的操作数,直接返回数组长度;

流程图和代码如下:

java 复制代码
    public int minOperations(int[] nums, int x) {
        int sum = 0;
        for (int i : nums) {
            sum += i;
        }
        if (sum - x < 0) {
            return -1;
        }
        if (sum - x == 0) {
            return nums.length;
        }
        int n = nums.length;
        int count = n + 1;
        for (int left = 0, right = 0, sum1 = 0; right < n; right++) {
            sum1 += nums[right];
            while (left <= right && sum1 > sum - x) {
                sum1 -= nums[left++];
            }
            if (sum1 == sum - x) {
                count = Math.min(count, n - (right - left + 1));
            }
        }
        return count == n + 1 ? -1 : count;
    }

希望读者给出建议!

相关推荐
都叫我大帅哥35 分钟前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行44 分钟前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_123452 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
码智社3 小时前
JSON 零基础到资深全体系教程
java·json
AndrewHZ3 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场3 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
wgego4 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
机建狂魔4 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
玖玥拾4 小时前
LeetCode 88 合并两个有序数组
算法·leetcode