加加加最小的作法x减到0

君思宇 2025-05-21 22:15:12
class Solution {
    public int minOperations(int[] nums, int x) {
        // 计算数组的总和
        int totalSum = 0;
        for (int num : nums) {
            totalSum += num;
        }
        
        // 目标值:总和减去x
        int target = totalSum - x;
        
        // 如果目标值为负,无法通过移除元素使x减为0
        if (target < 0) {
            return -1;
        }
        
        // 如果目标值为0,说明需要移除所有元素
        if (target == 0) {
            return nums.length;
        }
        
        // 初始化变量:最大子数组长度、当前窗口和、窗口左边界
        int maxLen = -1;
        int currentSum = 0;
        int left = 0;
        
        // 滑动窗口右边界
        for (int right = 0; right < nums.length; right++) {
            // 扩展窗口,累加当前元素
            currentSum += nums[right];
            
            // 当窗口和超过目标值时,收缩左边界
            while (currentSum > target && left <= right) {
                currentSum -= nums[left];
                left++;
            }
            
            // 如果当前窗口和等于目标值,记录最大长度
            if (currentSum == target) {
                maxLen = Math.max(maxLen, right - left + 1);
            }
        }
        
        // 如果找到了符合条件的子数组,返回移除元素的最小次数
        // 否则返回-1
        return maxLen != -1 ? nums.length - maxLen : -1;
    }
}
  1. 计算总和:遍历数组计算所有元素的总和totalSum
  2. 目标值转换:计算目标值target = totalSum - x。如果target为负,直接返回 - 1;如果target为 0,直接返回数组长度。
  3. 滑动窗口初始化:使用变量leftright表示窗口的左右边界,currentSum记录当前窗口的和,maxLen记录符合条件的最长子数组长度。
  4. 扩展窗口:右边界right不断右移,累加元素到currentSum
  5. 收缩窗口:当currentSum > target时,左边界left右移,减小currentSum
  6. 记录最大长度:当currentSum == target时,更新maxLen为当前窗口长度和之前记录的最大值中的较大值。
...全文
8 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

118

社区成员

发帖
与我相关
我的任务
社区描述
这里专为新疆政法学院的探索者而建,英雄不问出处。起跑线是起点,热忱与坚持为加速器,无论bug缠身的项目,还是攻克的算法顿悟,每滴汗水皆被珍藏。执炬前行,终将照亮彼此峰顶,我们携手同行。
课程设计笔记经验分享 高校 新疆·图木舒克市
社区管理员
  • 雲中203
  • SHAO060706
  • Poeir_
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

英雄不问出处

试试用AI创作助手写篇文章吧