首页 > 其他分享 >1658. 将 x 减到 0 的最小操作数

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

时间:2023-04-06 19:47:07浏览次数:39  
标签:操作数 return target nums int 最小 1658 ans 指针

题目描述

给一个整数数组nums和整数x
需要从数组的左边或者右边删除元素,然后用x减去删除的元素
问如果x刚好成删到0,怎么删最短?

f1-反向思考+双指针

基本分析

  1. 反向思考?找一个最长的子数组满足和= sum(nums) - x
  2. 为啥可以双指针?(1)元素都是整数,序列和是单调的;(2)元素连续

代码

    def minOperations(self, nums: List[int], x: int) -> int:
        n = len(nums)
        l = 0
        target = sum(nums) - x
        if target < 0:
            return -1

        s = 0
        ans = -1
        for r, x in enumerate(nums):
            s += x
            while s > target:
                s -= nums[l]
                l += 1
            if s == target:
                ans = max(ans, r - l + 1)
        
        if ans < 0:
            return -1
        else:
            return n - ans

总结

  1. 反向思考
f2-直接计算+双指针

基本分析

  1. 怎么直接计算?(1)先找到后缀中满足和<=x的最长后缀的索引;(2)枚举前缀l,while中一直往后挪右指针,找到和不大于x的索引,while出来后如果=,更新答案。

代码

class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        s, n = 0, len(nums)
        
        # 找到最远的满足后缀和<=x的索引
        r = n
        while r > 0 and s + nums[r - 1] <= x:
            r -= 1
            s += nums[r]

        # 出来的s不一定就满足>=的要求
        if r == 0 and s < x:
            return -1
        # 出来的值可能会等,可能会>
        if s == x:
            ans = n - r
        else:
            ans = inf
        
        for l in range(n):
            s += nums[l]
            while r < n and s > x:
                s -= nums[r]
                r += 1
            # 出来的s不一定就<=x
            if s > x:
                break
            if s == x:
                ans = min(ans, l + 1 + n - r)
        
        if ans == inf:
            return -1
        else:
            return ans

总结

  1. 在找后缀的时候,r是最远的满足s<=x的的位置
  2. 为啥出来的r也可能不满足要求?r已经计算到了0,s就是整个元素的和,如果<x, 表示不能删
  3. 给ans赋初值的时候有啥细节?如果s本身就是一个答案,需要考虑进来,就是n-r。如果不是,因为要求最小值,初值给inf
  4. 计算结果的思路?枚举左端点,委会两边的和s,这个时候s可能会< = 或者 > x (1)小于时候,继续枚举;(2)=更新答案;(3)> 时候,右指针需要往右(但不能越界),更新s;出来的s可能是<=x的情况,如果是=继续更新答案

标签:操作数,return,target,nums,int,最小,1658,ans,指针
From: https://www.cnblogs.com/zk-icewall/p/17293927.html

相关文章

  • 粒子群算法PSO优化LSSVM最小二乘支持向量机惩罚参数c和核函数参数g
    粒子群算法PSO优化LSSVM最小二乘支持向量机惩罚参数c和核函数参数g,用于回归预测,有例子,易上手,简单粗暴,直接替换数据即可。仅适应于windows系统。质量保证,完美运行。        本人在读博士研究生,已发表多篇sci,非网络上的学习代码,不存在可比性。ID:6999630547781158......
  • 111. 二叉树的最小深度
    给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。classSolution{public:intminDepth(TreeNode*root){if(root==nullptr)return0;if(!root->left&&!root->right......
  • 【LeetCode排序专题02】最小k个数,关于快速排序的讨论
    最小k个数输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例1:输入:arr=[3,2,1],k=2输出:[1,2]或者[2,1]示例2:输入:arr=[0,1,2,1],k=1输出:[0]限制:0<=k<=arr.length<=100000<=arr[i......
  • 155.最小栈 Java
    155.最小栈设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素......
  • 最小覆盖子串(哈希表、字符串)、两数之和(数组、哈希表)、二叉树的层序遍历 II(树、广
    最小覆盖子串(哈希表、字符串)给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。**注意:**如果s中存在这样的子串,我们保证它是唯一的答案。示例1:输入:s="ADOBECODEBANC",t="ABC"输出:"B......
  • m基于最小生成树算法的无线传感器网络MCDS生成matlab仿真
    1.算法描述       一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。图的所有生成树中具有边上的权值之和最小的树称为图的最小生成树(Minimu......
  • 面试题45(Java)-把数组排成最小的数(中等)
    题目:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例1:输入:[10,2]输出:"102"示例 2:输入:[3,30,34,5,9]输出:"3033459"提示:0<nums.length<=100说明:输出结果可能非常大,所以你需要返回一个字符串而不......
  • 【DP】LeetCode 64. 最小路径和
    题目链接64.最小路径和思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律表示状态假设到了右下角,考虑一下我们要存储的信息走到最后坐标的最小步数当前坐标的信息,用来判断是否走到了右下角很容易联想到使用......
  • 453.最小操作次数使数组元素相等
    最小操作次数使数组元素相等给你一个长度为n的整数数组,每次操作将会使n-1个元素增加1。返回让数组所有元素相等的最小操作次数。示例1:输入:nums=[1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3]=>[2,3,3]=>[3,4,3]=>[4,4,4]......
  • GNOME 窗口添加最大化、最小化按钮
    1、安装工具使用终端命令安装优化工具yuminstallgnome-tweak-tool 2、配置gnome-tweak-tool安装完毕后,在应用程序的“工具”中找到“优化”程序打开。然后选择“窗口标题栏”,将里面的“最大化”、“最小化”选项打开即可。  转载:https://www.likecs.com/show-308......